将async支持设置为true后,使用jersey实现SSE无法正常工作

时间:2015-12-13 07:29:28

标签: javascript html5 jersey server-sent-events

我正在尝试在服务器端使用jersey实现SSE。我在这里有多个问题: 我的服务器代码如下:

@GET
@Path("message")
@Produces(SseFeature.SERVER_SENT_EVENTS)
public EventOutput getMessage() {

    final EventOutput output = new EventOutput();
    try {
        output.write(new OutboundEvent.Builder().name("custom-message").data(String.class, "mymessage").build());
    } catch (IOException e) {
        try {
            output.close();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        e.printStackTrace();
    }


    return output;

最初,我能够使用浏览器网络调试器每秒查看数据。但每次服务器发送事件时,服务器都会记录如下内容:

  

警告:尝试将servlet请求置于异步模式中   失败。请检查您的servlet配置 - 所有Servlet   必须参与请求处理的实例和Servlet过滤器   显式声明对异步请求处理的支持。   java.lang.IllegalStateException:!asyncSupported

为了解决这个问题,我在我的web.xml中添加了一个支持async的标签。现在我的web.xml看起来像:

 <display-name>ssetest</display-name>
    <servlet>
        <servlet-name>ssetest</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>package.rest</param-value>
        </init-param>

        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>

        <load-on-startup>1</load-on-startup>
        <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>ssetest</servlet-name>
        <url-pattern>/test/*</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
            <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

。在此更改之后,我只从服务器获得一个事件。事件不会每秒生成。我在配置或代码中遗漏了什么?

我正在使用最新的球衣版本。服务器是码头9。

A snippet from my build.gradle : 
    compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.22'
    compile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.22'
    compile 'org.glassfish.jersey.media:jersey-media-sse:2.22'

2。我无法从我的客户端代码中读取sse事件。我的客户端代码如下:

  if(typeof(EventSource) !== "undefined") {
     var source = new EventSource("url");
     source.onmessage = function(event) {
     document.getElementById("result").innerHTML = event.data;
};

永远不会执行onMessage块。我的客户端代码有什么问题吗?

任何帮助表示赞赏!在此先感谢:)

0 个答案:

没有答案