服务器发送的事件不适用于泽西SSE

 余逮月笑下死手 发布于 2023-02-08 21:41

我正在尝试使用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代码如下.


小智.. 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();

在客户端,当没有发送命名事件时,它会触发`eventSource.onmessage`处理程序.设置一个时,你应该设置`eventSource.addEventListener('eventnamehere',function(ev){}` (2认同)


小智.. 5

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

此代码应与上面的Jersey示例一起使用.


我发现这篇文章对于理解SSE在浏览器端的工作方式非常有用:http://www.sitepoint.com/server-sent-events/.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有