【发布时间】:2014-09-22 08:57:52
【问题描述】:
我有 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());
});
这是使用事件输出推送消息的服务器代码
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 server 4 和 jersey 2.9.1 版本的 jar。浏览器是chrome。
【问题讨论】:
标签: jakarta-ee servlets jersey-2.0