有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpring事件发射器停止在新连接上向以前的客户端发送事件

我是新来的。我有一个事件发射器,它每2秒钟发送一次更新(使用托管在Tomcat上的SseEmitter) 当我在新窗口中打开URL时,我看到消息没有发送到以前的窗口。请看下图。 events in 3 browser windows 这是服务器发送事件的预期行为吗?我需要向连接到我的流式URL的所有客户端发送更新。 我的应用程序或tomcat服务器是否需要其他配置或设置?请帮忙

这是控制器

@Controller
public class MySSEController {
    private final SseEmitter sseEmitter = new SseEmitter(100000l);
    private int counter = 0;

    @RequestMapping("/ssestream")
    public SseEmitter getRealTimeMessageAction() throws IOException {

        sseEmitter.send("MessageCounter : " + counter);
        return sseEmitter;
    }

    @Scheduled(fixedDelay = 2*1000)
    public void scheduledMsgEmitter() throws IOException
    {
        if(null != sseEmitter) {
            sseEmitter.send("MessageCounter : " + ++counter);
        }
    }
}

共 (1) 个答案

  1. # 1 楼答案

    试试这个:

    @Controller
    public class MySSEController {
        private List<SseEmitter> sseEmitters = new ArrayList<>();
    
        private int counter = 0;
    
        @RequestMapping("/ssestream")
        public SseEmitter getRealTimeMessageAction() throws IOException {
            SseEmitter sseEmitter = new SseEmitter(100000l);
            sseEmitter.send("MessageCounter : " + counter);
            sseEmitters.add(sseEmitter);
            return sseEmitter;
        }
    
        @Scheduled(fixedDelay = 2 * 1000)
        public void scheduledMsgEmitter() {
            counter++;
            List<SseEmitter> toRemove = new ArrayList<>();
    
            for (SseEmitter sseEmitter : sseEmitters) {
                try {
                    sseEmitter.send("MessageCounter : " + counter);
                } catch (IOException ignore) {
                    toRemove.add(sseEmitter);
                }
            }
    
            for (SseEmitter remove : toRemove) {
                sseEmitters.remove(remove);
            }
        }
    }