我让jquery客户端期待来自java servlet/ JAX-RS服务器的Jersey SSE事件。
我有这个客户端代码向服务器发起请求
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推送消息的服务器代码
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。
发布于 2015-11-07 08:02:27
我和你有同样的问题,在打开wireshark后我最终解决了这个问题。也就是说,数据只在HTTP响应体上发送,而不是流/分块。换句话说,如果eventOutput.close没有被显式调用,它就不会被发送。
首先,检查您的代理(如果您正在使用代理),以确保在这一端没有缓冲。
最后,检查您的java webapp上是否有任何可能正在收集响应的过滤器。在我的例子中,阻止TCP数据包发送的是Dropwizard中的gzip过滤器。
我在JERSEY-jira写了更详细的内容。
发布于 2017-04-08 22:19:34
我也有同样的问题,我解决了在我的ResourceConfig.java中删除的问题,如果你有:
EncodingFilter.enableFor(this, GZipEncoder.class);发布于 2014-07-31 02:09:30
EventSource不是jQuery对象(除非您正在加载某种插件)。
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);https://stackoverflow.com/questions/25041542
复制相似问题