2013-12-20 42 views
4

我正在尝试使用泽西岛的JavaScript SSE。我的资源中有以下代码。我在Java7和Tomcat 7上托管。我没有得到任何错误。但我在页面上看不到数据。我的电话/broadcast发布数据。它确实显示消息。但没有任何客户。在Firefox中,我确实看到/broadcast事件被多次触发。服务器发送的事件不适用于运动衫SSE

这是我使用的参考。 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

你可以尝试在命令行上使用curl吗?有时浏览器缓存响应。 – Salil

+0

@Salil你可以请提供关于如何使用curl进行订阅的例子吗? –

+0

这是一个命令行实用程序,默认情况下在大多数Unix/Linux(包括Mac OS X)上进行编程。 http://www.thegeekstuff.com/2012/04/curl-examples/ – Salil

回答

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(); 
+0

这个解决方案也为我解决它! – Mario

+2

在客户端,当没有命名事件被发送时,它触发'eventSource.onmessage'处理程序。如果我更改了标题od web.xml,标记会导致问题,则应设置'eventSource.addEventListener('eventnamehere',function(ev){}' – badunk

5

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

该代码应该与上面的泽西样本一起使用。

<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/

0

我必须做以下事情才能使它与tomcat 7.0.69和java 1.8以及球衣2.22.2一起使用如果涉及到任何人体的任何使用,请分享它。

  1. 添加以下依赖你的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> 
    
  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" >

  3. 新泽西Servlet容器应该是异步支持的,所以将其添加到web.xml中的运动衫servlet中:

<异步支持>真< /异步支持>

  • 如果你使用任何过滤器确保它也异步支持:

    <异步支持>真< /异步支持>

  • +0

    ... – Nilesh

    相关问题