Java 服务器发送事件不适用于服务器
我正在尝试使用泽西岛的JavaScript SSE。我的资源中有以下代码。我在Java7和Tomcat7上托管。我没有得到任何错误。但我在第页也没有看到数据 我调用Java 服务器发送事件不适用于服务器,java,jersey,servlet-3.0,server-sent-events,jersey-2.0,Java,Jersey,Servlet 3.0,Server Sent Events,Jersey 2.0,我正在尝试使用泽西岛的JavaScript SSE。我的资源中有以下代码。我在Java7和Tomcat7上托管。我没有得到任何错误。但我在第页也没有看到数据 我调用/broadcast发布数据。它确实显示了信息。但没有任何事情发生在客户身上。在Firefox中,我确实看到了多次触发的/broadcast事件 这是我使用的参考资料。 我的Index.html代码如下所示 <script type="text/javascript"> var url = "webapi/broadca
/broadcast
发布数据。它确实显示了信息。但没有任何事情发生在客户身上。在Firefox中,我确实看到了多次触发的/broadcast
事件
这是我使用的参考资料。
我的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>
var url=“webapi/broadcast”;
//变量url=”http://localhost:8080/trackapp/webapi/broadcast/listen";
var source=新事件源(url);
source.onerror=函数(事件)
{
log(“错误[“+source.readyState+”]”);
};
source.onopen=函数(事件){
log(“eventsource已打开!”);
};
source.onmessage=函数(事件)
{
console.log(事件数据);
document.getElementById(“结果”).innerHTML+=event.data+“
”;
};
以下是一个可能对您有所帮助的示例:
您也可以参考此页面,查看您的浏览器是否支持EventSource API我遇到了相同的问题,并通过不设置事件名称解决了它(我不知道为什么,但这似乎是解决方案)。。。这是密码
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();
该方法设置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>
var url=“webapi/broadcast”;
var source=新事件源(url);
source.addEventListener(
“信息”,
功能(事件){
console.log(事件数据);
document.getElementById(“结果”).innerHTML+=event.data+“
”;},
假);
我发现本文有助于理解SSE在浏览器端的工作原理:。我必须做以下工作,才能使它与tomcat 7.0.69和java 1.8以及jersey 2.22.2一起工作,如果它涉及到任何主体的使用,我只需共享它
<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>
org.glassfish.jersey.containers
“version=“3.0”>
您可以尝试在命令行上使用curl吗?有时浏览器会缓存响应。@Salil您可以提供如何使用curl执行此订阅的示例吗?这是一个命令行实用程序,默认情况下在大多数Unix/Linux(包括Mac OS X)上提供。在客户端,当未发送命名事件时,它会触发
eventSource.onmessage
处理程序。当设置一个处理程序时,您应该设置eventSource.addEventListener('eventnamehere',函数(ev){}
第一个链接无效,第二个链接返回503
<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>