JAVA设计模式-监听者模式

什么是监听者模式

监听器模式是一种观察者模式的扩展,也被称为发布-订阅模式。在监听器模式中,存在两类角色:事件源(Event Source)和监听器(Listener)。事件源负责产生事件,而监听器负责监听事件的发生并采取相应的行动。当事件源触发事件时,所有注册了对应类型监听器的对象都会得到通知,然后执行相应的操作。

应用背景

1.封装一个AI-GPT工具包,集成国内大模型,实现流式聊天

2.作为工具包不能依赖springboot-web,也就是不能把HttpServletResponse当做参数传递

方案

把监听者当做一个参数传入工具包,监听整个流的输出

调用方

复制代码
public Text2TextStreamObserver streamOutputResposeOberverBuild(ResponseBodyEmitter emitter,AiChatDto aiChatDto) {
        StringBuffer sb = new StringBuffer();
        return new Text2TextStreamObserver() {
            @Override
            public void onBegin() {
            }
            @Override
            public void onNext(String data) {
                try {
                    emitter.send(data);
                    sb.append(data);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            @Override
            public void onEnd() {
                try {
                    emitter.complete();
                    createLog(aiChatDto, sb.toString());
                    LOGGER.info("问题:{},答案:{}",JSONUtil.toJsonStr(aiChatDto),sb);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
            @Override
            public void onFailure(Throwable throwable) {
                try {
                    emitter.completeWithError(throwable);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        };
    }

工具包

复制代码
public List<String> text2TextStream(MoonshotText2TextInput input, Text2TextStreamObserver streamObserver) {
        ArrayList dataList = new ArrayList();
        try {
            Request request = this.buildRequest(input, true);
            SSEListener sseListener = new SSEListener(dataList, streamObserver);
            ExecuteSSEUtil.executeSSE(request, sseListener, this.httpclient);
            return dataList;
        } catch (Exception var6) {
            throw new RuntimeException("流式请求异常:", var6);
        }
    }

SSEListener extends EventSourceListener
相关推荐
Love__Tay2 分钟前
【学习笔记】Python金融基础
开发语言·笔记·python·学习·金融
Lilith的AI学习日记15 分钟前
什么是预训练?深入解读大模型AI的“高考集训”
开发语言·人工智能·深度学习·神经网络·机器学习·ai编程
程序员岳焱1 小时前
深度剖析:Spring AI 与 LangChain4j,谁才是 Java 程序员的 AI 开发利器?
java·人工智能·后端
wangjinjin1801 小时前
Python Excel 文件处理:openpyxl 与 pandas 库完全指南
开发语言·python
愚润求学1 小时前
【C++】类型转换
开发语言·c++
都叫我大帅哥1 小时前
AQS(AbstractQueuedSynchronizer)深度解剖:从“奶茶店排队”到源码级设计哲学
java
斯奕sky_small-BAD1 小时前
C++ if语句完全指南:从基础到工程实践
java·开发语言·php
云之渺1 小时前
125java
java
都叫我大帅哥1 小时前
Java ReentrantLock:从“舔狗式等待”到源码级征服指南
java
程序员岳焱1 小时前
Java 高级泛型实战:8 个场景化编程技巧
java·后端·编程语言