我有一个使用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。
onMessage
处理程序。此外,我正在运行Glassfish推广版本b08,其中包括Jersey 2.10.1。 - Baldy