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();
}
}
}
我正在使用 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();
}
}
}