【问题标题】:Jetty, JAX-RS 2.1 and SSE码头、JAX-RS 2.1 和 SSE
【发布时间】:2017-11-20 21:58:51
【问题描述】:

我尝试在 Jetty 9.4.7 上测试服务器端事件 (SSE),但它不起作用(但适用于 GlassFish 5)。这是我的代码:

@Path("sse")
public class SseResource {

    @GET
    @Produces(MediaType.SERVER_SENT_EVENTS)
    @Path("time")
    public void currentTime(@Context SseEventSink eventSink, @Context Sse sse) {
        new Thread(() -> {
                OutboundSseEvent event = sse.newEventBuilder().name("current-time")
                        .data(String.class, LocalTime.now().toString()).build();
                eventSink.send(event);
        }).start();
    }   
}

当我尝试调用我的端点 /sse/time 时,我得到 404 异常:

javax.ws.rs.NotFoundException: 未找到 HTTP 404 在 org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:274) [jersey-server-2.26.jar:?] 在 org.glassfish.jersey.internal.Errors$1.call(Errors.java:272) [jersey-common-2.26.jar:?] 在 org.glassfish.jersey.internal.Errors$1.call(Errors.java:268) [jersey-common-2.26.jar:?] 在 org.glassfish.jersey.internal.Errors.process(Errors.java:316) [jersey-common-2.26.jar:?] 在 org.glassfish.jersey.internal.Errors.process(Errors.java:298) [jersey-common-2.26.jar:?]

请指教。

【问题讨论】:

    标签: jersey-2.0 jetty-9


    【解决方案1】:

    我对此很陌生,但这段代码似乎可以使用 jax rs 连接器。

    @Path( "events" )
    public class ExampleService {
    
    @GET
    @Produces( SseFeature.SERVER_SENT_EVENTS )
     public EventOutput getServerSentEvents() {
      final EventOutput eventOutput = new EventOutput();
        new Thread( new Runnable() {
    
      @Override
      public void run() {
        try {
          for( int i = 0; i < 10; i++ ) {
            Thread.sleep( 1000 );
            final OutboundEvent.Builder eventBuilder = new OutboundEvent.Builder();
            eventBuilder.name( "toevent" );
            eventBuilder.data( String.class, "Hello world " + i + "!");
            final OutboundEvent event = eventBuilder.build();
            eventOutput.write( event );
          }
        } catch( IOException e ) {
          throw new RuntimeException( "Error when writing the event.", e );
        } catch( InterruptedException e ) {
          e.printStackTrace();
        } finally {
          try {
            eventOutput.close();
          } catch( IOException ioClose ) {
            throw new RuntimeException( "Error when closing the event output.", ioClose );
          }
        }
      }
    } ).start();
    return eventOutput;
     }
     }
    

    【讨论】:

    • 愿广播公司也能工作,但我没能成功。
    • 谢谢。你用 Jetty 测试过吗?
    • 我测试了这段代码并在码头运行,但我从这里使用 jax-rs 连接器:eclipsesource.com/blogs/2014/02/04/…
    【解决方案2】:

    JAX-RS 2.1 遵循 Java EE 8 规范。最新的 Jetty 9.4.x 遵循 Java EE 7 规范。因此,您需要等待支持 EE 8 的 Jetty 10。但它没有任何发布日期。

    也就是说,Jetty 确实支持带有 JAX-RS 2.0 的 SSE

    【讨论】:

      猜你喜欢
      • 2020-06-08
      • 2019-11-22
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 2011-12-16
      相关资源
      最近更新 更多