我正在尝试使用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代码如下.
小智.. 9
我有同样的问题,并通过不设置事件的名称解决它(我不知道为什么,但这似乎是解决方案)...这里是代码
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();
在客户端,当没有发送命名事件时,它会触发`eventSource.onmessage`处理程序.设置一个时,你应该设置`eventSource.addEventListener('eventnamehere',function(ev){}` (2认同)
小智.. 5
该OutboundEvent.Builder.name方法设置SSE事件字段的值.因此,它不被视为消息,并且无法使用.onmessage处理程序进行侦听.解决方案是使用该addEventListener
方法注册侦听器方法.
此代码应与上面的Jersey示例一起使用.
我发现这篇文章对于理解SSE在浏览器端的工作方式非常有用:http://www.sitepoint.com/server-sent-events/.