首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jersey SSE client输出写入不会发送到客户端,除非已关闭

Jersey SSE client输出写入不会发送到客户端,除非已关闭
EN

Stack Overflow用户
提问于 2014-07-31 00:00:09
回答 3查看 1.1K关注 0票数 3

我让jquery客户端期待来自java servlet/ JAX-RS服务器的Jersey SSE事件。

我有这个客户端代码向服务器发起请求

代码语言:javascript
复制
var source = new EventSource("api/chat");
$(source).on("message", function (evt) {
    var chatMsg = JSON.parse(evt.originalEvent.data);    
    $("#chat").val(chatMsg.userid + ": " + chatMsg.msg + "\n" + $("#chat").val());
});

这是使用eventoutput推送消息的服务器代码

代码语言:javascript
复制
JsonObject obj = Json.createObjectBuilder()
                .add("userid", userid)
                .add("msg", msg)
                .build();
OutboundEvent evt = new OutboundEvent.Builder()
                .mediaType(MediaType.APPLICATION_JSON_TYPE)
                .data(JsonObject.class, obj)
                .build();   

eventOutput.write(evt);
eventOutput.close();

这里发生的情况是,如果不使用eventoutput.close(),客户端将得不到任何响应。

根据文档,这种关闭不是必需的,或者至少在任何地方都没有提到。但是,如果不这样做,消息将被排队,并且只有当我试图关闭服务器时,它们才会被传递。这很奇怪。我发现了一种使用close()的变通方法,它有助于刷新消息,但当然也有关闭连接的副作用。虽然连接是从客户端自动重新创建的,但我只是试图理解为什么在我的情况下需要关闭?有没有人遇到过类似的问题?

这与一些标准响应流缓冲区大小有关吗?我的消息是用户键入的聊天字符串,它可以甚至是1个字符的长度。

我使用的是GlassFish服务器4和jersey 2.9.1版本的jars。浏览器是chrome。

EN

回答 3

Stack Overflow用户

发布于 2015-11-07 08:02:27

我和你有同样的问题,在打开wireshark后我最终解决了这个问题。也就是说,数据只在HTTP响应体上发送,而不是流/分块。换句话说,如果eventOutput.close没有被显式调用,它就不会被发送。

首先,检查您的代理(如果您正在使用代理),以确保在这一端没有缓冲。

最后,检查您的java webapp上是否有任何可能正在收集响应的过滤器。在我的例子中,阻止TCP数据包发送的是Dropwizard中的gzip过滤器。

我在JERSEY-jira写了更详细的内容。

票数 3
EN

Stack Overflow用户

发布于 2017-04-08 22:19:34

我也有同样的问题,我解决了在我的ResourceConfig.java中删除的问题,如果你有:

代码语言:javascript
复制
EncodingFilter.enableFor(this, GZipEncoder.class);
票数 0
EN

Stack Overflow用户

发布于 2014-07-31 02:09:30

EventSource不是jQuery对象(除非您正在加载某种插件)。

代码语言:javascript
复制
source.addEventListener('message', function(e) {
    console.log(e.data);
}, false);

source.addEventListener('open', function(e) {
    // Connection was opened.
}, false);

source.addEventListener('error', function(e) {
    if (e.readyState == EventSource.CLOSED) {
        // Connection was closed.
    }
}, false);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25041542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档