2016-05-03 18 views
0

Jersey 2.5.1を使用してServer-Sent-Events Clientを実装しようとしています(それ以降のバージョンにアップグレードすることはできません)。 。 コードをmanualから可能な限り単純なものと考えていますが、成功していません。Jersey SSEクライアントはイベントを受け取りません

私は他のサーバーに対してクライアントをテストしましたが、その動作は同じです。したがって、私の問題はクライアントベースであると信じています。 クライアントはリソースに接続し、サーバーはイベントの送信を開始します。しかし、イベントは受信されず、接続は途中で終了します。

EventInputの代わりにEventSourceを使用しようとしましたが、結果は同じです。 誰かが私に行方不明を教えてもらえますか?ありがとう。

サーバコード:

@Path("events") 
public class SseResource { 

    /** 
    * Create stream. 
    * @return chunkedOutput of events. 
    */ 
    @GET 
    @Produces(SseFeature.SERVER_SENT_EVENTS) 
    public EventOutput getServerSentEvents() { 
    System.out.println("Received GetEvent"); 
    final EventOutput eventOutput = new EventOutput(); 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
     try { 
      for (int i = 0; i < 10; i++) { 

      final OutboundEvent.Builder eventBuilder = new OutboundEvent.Builder(); 
      eventBuilder.name("message-to-client"); 
      eventBuilder.data(String.class, "Hello world " + i + "!"); 
      final OutboundEvent event = eventBuilder.build(); 
      eventOutput.write(event); 
      System.out.println("Wrote event " + i); 

      // ... code that waits 1 second 
      try { 
       TimeUnit.MILLISECONDS.sleep(10); 
      } catch (InterruptedException e) { 
       Thread.currentThread().interrupt(); 
      } 

      } 
     } catch (IOException e) { 
      System.out.println("Error when writing the event" + e); 
      throw new RuntimeException("Error when writing the event.", e); 
     } finally { 
      try { 
      eventOutput.close(); 
      } catch (IOException ioClose) { 
      System.out.println("Error when closing the eventOuput" + ioClose); 
      throw new RuntimeException("Error when closing the event output.", ioClose); 
      } 
     } 
     } 
    }).start(); 
    return eventOutput; 
    } 
} 

クライアントコード:

import org.glassfish.jersey.media.sse.EventInput; 
import org.glassfish.jersey.media.sse.InboundEvent; 
import org.glassfish.jersey.media.sse.SseFeature; 
... 
    public final void simpleClientTest() { 
    final Client client = ClientBuilder.newBuilder().register(SseFeature.class).build(); 
    final WebTarget target = client.target("http://localhost:8182/events"); 

    final EventInput eventInput = target.request().get(EventInput.class); 
    while (!eventInput.isClosed()) { 
     final InboundEvent inboundEvent = eventInput.read(); 
     if (inboundEvent == null) { 
     // connection has been closed 
     break; 
     } 
     System.out.println(inboundEvent.getName() + "; " + inboundEvent.readData(String.class)); 
    } 
    System.out.println("eventInput finished"); 
    } 

答えて

0

私は、最終的には、問題の原因を発見しました。サーバー起動コード(上記には記載されていません)にはSseFeature.classリソースが含まれていませんでした。ここを含めて、他の誰かがこの問題を抱えています....

public void startServer() throws IOException { 
    final URI baseUri = UriBuilder.fromUri("http://0.0.0.0").port(serverPort).build(); 
    System.out.println("Starting media server at: " + baseUri); 
    final ResourceConfig config = new ResourceConfig(SseResource.class, SseFeature.class); 
    server = GrizzlyHttpServerFactory.createHttpServer(baseUri, config); 
    } 
+0

Node.jsベースのサーバー用の単純なJersey SSEクライアントを作成しようとしています。しかし、私は[クライアント上のイベントは受け付けていません](ここをクリックしてください)](http://stackoverflow.com/questions/43640962/jersey-sse-client-is-not-receiving-events)私は何が欠けているかもしれないかについてのあらゆるアイデア? –

関連する問題