Jersey 的 EventSource 阻塞直到接收到第一个数据块

Jersey's EventSource blocks until first data chunk was receiveid

我正在使用 Jersey 连接到服务器 SSE 通道(也是使用 Jersey 实现的)。

客户代码:

...
WebTarget target = client.target(uri);
EventSource client2es = new EventSource(target)
...

我的问题是 new EventSource(target) 阻塞,直到服务器发送第一块数据。一旦 EventSource.open 被调用,Jersey EventSource 实现就会调用 awaitFirstContact()

有什么理由必须等待第一次联系吗?如何在服务器发送第一个数据块之前连接到事件源而不阻塞客户端?

查看EventSource 的代码,awaitFirstContact() 似乎不需要open 方法。我认为肯定应该有 open 方法而不阻塞,因为其他处理是异步完成的。所以我认为你必须解决它。 EventSource 构造函数中有第二个参数 - boolean open。你可以在那里传递false,所以事件源不会被打开,而不是创建新线程在那里打开事件源。

public class Main {
    public static void main(String[] args) {
        WebTarget target = null;//...
        EventSource es = openAsynchronizely(target);

        es.register(new EventListener() {
            @Override
            public void onEvent(InboundEvent inboundEvent) {
                ///...
            }
        });
    }

    static EventSource openAsynchronizely(WebTarget target) {
        EventSource eventSource = new EventSource(target, false);
        new OpenThread(eventSource).start();
        return eventSource;
    }

    static class OpenThread extends Thread {
        private final EventSource eventSource;

        public OpenThread(EventSource eventSource) {
            this.eventSource = eventSource;
        }

        @Override
        public void run() {
            eventSource.open();
        }
    }
}