首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何让EventSource.onmessage正常工作?

如何让EventSource.onmessage正常工作?
EN

Stack Overflow用户
提问于 2021-10-28 07:37:01
回答 2查看 72关注 0票数 0

如何让EventSource.onmessage正常工作?

下面是我的订阅和推送事件代码:

代码语言:javascript
运行
复制
    public SseEmitter subscribe() throws Exception {
        SseEmitter emitter = new SseEmitter(1800000L);

        emitters.add(emitter);

        emitter.onCompletion(() -> {
            synchronized (emitters) {
                emitters.remove(emitter);
            }
        });
        emitter.onTimeout(() -> {
            emitter.complete();
            emitters.remove(emitter);
        });

        return emitter;
    }
代码语言:javascript
运行
复制
    @Async
    public void pushEventMap(Map<String, Object> pushMap) throws IOException {
        List<SseEmitter> deadEmitters = new ArrayList<>();

        HashMap<String,Object> map = (HashMap<String,Object>) pushMap;

        emitters.forEach(emitter -> {
            try {
                emitter.send(SseEmitter.event().name("myEvent").data(map));
            } catch (Exception e) {
                emitter.completeWithError(e);
                logger_error.error("pushEvent Exception:" + e);
                deadEmitters.add(emitter);
            }
        });
        emitters.removeAll(deadEmitters);
    }

上述服务的控制器为:

代码语言:javascript
运行
复制
   @RequestMapping(value = "/subscribe", produces = "text/event-stream")
    public ResponseEntity<SseEmitter> subscribe() throws Exception {

        final SseEmitter emitter = eventService.subscribe();

        return new ResponseEntity<>(emitter, HttpStatus.OK);
    }

    @RequestMapping(value = "/publish")
    public void publish() throws IOException {
        eventService.pushEventMap(pushMap);
    }

我希望客户端通过js接收事件推送的数据。

代码语言:javascript
运行
复制
const eventInit = () => {

    console.log("eventInit called");
    const url = 'http://localhost:8080/itf/subscribe';
    const eventSource = new EventSource(url);

    var httpRequest = new XMLHttpRequest();

    eventSource.onmessage = (event) => {
        const data = JSON.parse(event.data);
        console.log('===');
        console.log(data);

    }
    eventSource.onopen = (event) => {
        console.log('sse open');
        console.log(event);
    }

    eventSource.onerror = (event) => {
        if (event.readyState == EventSource.CLOSED) {
            console.log('sse close');
        } else {
            console.log("onerror", e);
        }
    }

}

在这种情况下,如果我通过邮递员发送事件生成数据,控制台上就会出现sse open

但是,不会显示事件的结果。

如果我通过url直接访问/itf/subscribe,事件的结果就会显示在屏幕上。但是,我没有通过event.onmessage收到事件的结果。

我想要的是引发一个事件,然后通过onmessage函数接收事件的结果。

我想知道怎样才能得到活动的结果。

诚挚的问候

EN

回答 2

Stack Overflow用户

发布于 2021-10-28 17:08:57

代码没有问题,实际的问题是当我写响应给客户端时,我的响应消息应该如下所示。

代码语言:javascript
运行
复制
PrintWriter out = response.write("data: message"+value+"\n\n");
out.flush(); //don't forget to flush

在我的代码中,我遗漏了response对象中的最后一个部分"\n\n“,所以javascript中的source.onmessage(datalist)没有命中。

票数 0
EN

Stack Overflow用户

发布于 2021-10-29 07:36:18

代码语言:javascript
运行
复制
    eventSource.addEventListener('myEvent', function (event) {
        console.log(event);
        const data = JSON.parse(event.data);
        console.log('addEventListener');
        console.log(data);
        // console.log(data.siteCode);
        eventEffect(data);
    }, false);

这是正常的工作!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69750002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档