2016-01-20 37 views
0

我正在使用Jersey连接到服务器SSE通道(也使用Jersey实现)。Jersey的EventSource阻塞,直到第一个数据块被接收为止

客户端代码:

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

我的问题是new EventSource(target)块,直到服务器sents数据的第一块。一旦调用EventSource.open,Jersey EventSource实现将调用awaitFirstContact()

有什么理由要等待第一次接触?如何连接到事件源而不阻塞客户端,直到服务器发送第一个数据块?

回答

1

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

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(); 
     } 
    } 
} 
+0

运行一个专用的线程只是为了打开一个事件源是浪费资源。这也可以通过使用'EventSource.target(target).build()'来实现,而不使用构造函数的重载版本。 – gorootde

+0

这不像是你有别的选择,除了修补图书馆之外,还可以运行异步...至于创作 - 无论你喜欢什么...... –

相关问题