服务器发送的事件不适用于泽西SSE [英] Server-sent event does not work with jersey SSE

查看:137
本文介绍了服务器发送的事件不适用于泽西SSE的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Jersey的JavaScript SSE。我在我的资源中有以下代码。我在Java7和Tomcat 7上托管。我没有收到任何错误。但我在页面上看不到数据。

I am trying to use JavaScript SSE from Jersey. I have Following code in my resource. I am hosting on Java7 and Tomcat 7. I dont get any error. But I don't see data either on page.

我打电话给 / broadcast 发布数据。它确实显示了消息。但客户端没有任何东西。在Firefox中,我确实看到多次激活 / broadcast 事件。

I call /broadcast to post data. It does show message. But nothing comes on client. In Firefox, I do see /broadcast event fired multiple times.

这是我使用的参考。
https://jersey.java.net/documentation/latest/sse.html

This is reference I used. 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代码如下。

My Index.html code is as below.

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


推荐答案

我有同样的问题并通过不设置解决了事件的名称(我不知道为什么,但这似乎是解决方案)...这里是代码

I had the same problem and solved it by not setting the name of the event (i don't know why but this seems to be the solution)... here is the code

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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆