我正在尝试使用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代码如下。
<script type="text/javascript">
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 + "<br>";
};
</script>
答案 0 :(得分: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();
答案 1 :(得分:5)
OutboundEvent.Builder.name方法设置SSE事件字段的值。因此,它不被视为消息,并且无法使用.onmessage处理程序进行侦听。解决方案是使用addEventListener
方法注册侦听器方法。
此代码应与上面的Jersey示例一起使用。
<script type="text/javascript">
var url = "webapi/broadcast";
var source=new EventSource(url);
source.addEventListener(
"message",
function(event){
console.log(event.data);
document.getElementById("result").innerHTML+=event.data + "<br>"; },
false);
</script>
我发现这篇文章对于理解SSE在浏览器端的工作方式非常有用:http://www.sitepoint.com/server-sent-events/。
答案 2 :(得分:2)
以下示例可能对您有所帮助:http://en.kodcu.com/2013/11/jaxrs-2-html-5-server-sent-events-on-glassfish-4/
您也可以参考此页面查看您的浏览器是否支持EventSource API http://www.eventsourcehq.com/browser-support
答案 3 :(得分:1)
我必须执行以下操作才能使其与tomcat 7.0.69和java 1.8以及jersey 2.22.2一起使用。如果涉及到任何正文的使用,请分享它。
在Pom文件中添加以下依赖项:
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.22.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.22.2</version>
</dependency>
<!-- If you use json -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-processing</artifactId>
<version>2.22.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<!-- if your container implements Servlet API older than 3.0, use "jersey-container-servlet-core" -->
<artifactId>jersey-container-servlet</artifactId>
<version>2.22.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-sse</artifactId>
<version>2.22.2</version>
</dependency>
需要是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" >
&LT;异步支持&GT;真&LT; / async-supported&gt;
如果您使用任何过滤器,请确保它也支持异步:
&LT;异步支持&GT;真&LT; /异步支持&GT;