服务器发送的事件不适用于泽西SSE

我正在尝试使用Jersey的JavaScript SSE。 我在我的资源中有以下代码。 我在Java7和Tomcat 7上托管。我没有收到任何错误。 但我在页面上看不到数据。

我打电话/broadcast发布数据。 它确实显示了消息。 但客户端没有任何东西。 在Firefox中,我确实看到多次触发/broadcast事件。

这是我用的参考。 https://jersey.java.net/documentation/latest/sse.html

  package net.jigarshah.dse.tracker; import javax.inject.Singleton; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.glassfish.jersey.media.sse.EventOutput; import org.glassfish.jersey.media.sse.OutboundEvent; import org.glassfish.jersey.media.sse.SseBroadcaster; import org.glassfish.jersey.media.sse.SseFeature; @Singleton @Path("broadcast") public class SSEResource { private SseBroadcaster broadcaster = new SseBroadcaster(); @POST @Produces(MediaType.TEXT_PLAIN) @Consumes(MediaType.TEXT_PLAIN) public String broadcastMessage(String message) { OutboundEvent.Builder eventBuilder = new OutboundEvent.Builder(); message = message + "\n\n"; OutboundEvent event = eventBuilder.name("message") .mediaType(MediaType.TEXT_PLAIN_TYPE) .data(String.class, message) .build(); broadcaster.broadcast(event); System.out.println("broadcasting listen [" +message+ "]"); return "Message was '" + message + "' broadcast."; } @GET @Produces(SseFeature.SERVER_SENT_EVENTS) public EventOutput listenToBroadcast() { System.out.println("will listen"); final EventOutput eventOutput = new EventOutput(); this.broadcaster.add(eventOutput); return eventOutput; } } 

我的Index.html代码如下。

  var url = "webapi/broadcast"; //var url="http://localhost:8080/trackapp/webapi/broadcast/listen"; var source=new EventSource(url); source.onerror=function(event) { console.log("error [" + source.readyState + "]"); }; source.onopen = function(event){ console.log("eventsource opened!"); }; source.onmessage=function(event) { console.log(event.data); document.getElementById("result").innerHTML+=event.data + "
"; };

我有同样的问题,并通过不设置事件的名称解决它(我不知道为什么,但这似乎是解决方案)…这里是代码

 OutboundEvent.Builder eventBuilder = new OutboundEvent.Builder(); //WARNING: IF I SET THE NAME OF THE EVENT IT DOES NOT WORK //eventBuilder.name("message"); eventBuilder.mediaType(MediaType.APPLICATION_JSON_TYPE); eventBuilder.data(EventData.class, data); OutboundEvent event = eventBuilder.build(); 

OutboundEvent.Builder.name方法设置SSE事件字段的值。 因此,它不被视为消息,并且无法使用.onmessage处理程序进行侦听。 解决方案只是使用addEventListener方法来注册侦听器方法。

此代码应与上面的Jersey示例一起使用。

  

我发现本文对于理解SSE在浏览器端的工作方式非常有用: http : //www.sitepoint.com/server-sent-events/ 。

以下是一个可能对您有所帮助的示例: http : //en.kodcu.com/2013/11/jaxrs-2-html-5-server-sent-events-on-glassfish-4/

您也可以参考此页面查看您的浏览器是否支持EventSource API http://www.eventsourcehq.com/browser-support

我必须执行以下操作才能使其与tomcat 7.0.69和java 1.8以及jersey 2.22.2一起使用。如果涉及到任何正文的任何​​使用,请分享它。

  1. 在Pom文件中添加以下依赖项:

       org.glassfish.jersey.containers jersey-container-servlet-core 2.22.2   org.glassfish.jersey.core jersey-client 2.22.2    org.glassfish.jersey.media jersey-media-json-processing 2.22.2   org.glassfish.jersey.containers  jersey-container-servlet 2.22.2   org.glassfish.jersey.media jersey-media-sse 2.22.2  
  2. 需要是servlet 3所以web.xml的标题应该是这样的: < ?xml version="1.0" encoding="UTF-8"? > < web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd " version="3.0" > < ?xml version="1.0" encoding="UTF-8"? > < web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd " version="3.0" >

  3. Jersey Servlet Container应该是异步支持的,所以将它添加到web.xml中的jersey servlet中:

true

  1. 如果您使用任何filter,请确保它也支持异步:

    true