我正在尝试在服务器端使用jersey实现SSE。我在这里有多个问题: 我的服务器代码如下:
@GET
@Path("message")
@Produces(SseFeature.SERVER_SENT_EVENTS)
public EventOutput getMessage() {
final EventOutput output = new EventOutput();
try {
output.write(new OutboundEvent.Builder().name("custom-message").data(String.class, "mymessage").build());
} catch (IOException e) {
try {
output.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}
return output;
最初,我能够使用浏览器网络调试器每秒查看数据。但每次服务器发送事件时,服务器都会记录如下内容:
警告:尝试将servlet请求置于异步模式中 失败。请检查您的servlet配置 - 所有Servlet 必须参与请求处理的实例和Servlet过滤器 显式声明对异步请求处理的支持。 java.lang.IllegalStateException:!asyncSupported
为了解决这个问题,我在我的web.xml中添加了一个支持async的标签。现在我的web.xml看起来像:
<display-name>ssetest</display-name>
<servlet>
<servlet-name>ssetest</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>package.rest</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>ssetest</servlet-name>
<url-pattern>/test/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
。在此更改之后,我只从服务器获得一个事件。事件不会每秒生成。我在配置或代码中遗漏了什么?
我正在使用最新的球衣版本。服务器是码头9。
A snippet from my build.gradle :
compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.22'
compile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.22'
compile 'org.glassfish.jersey.media:jersey-media-sse:2.22'
2。我无法从我的客户端代码中读取sse事件。我的客户端代码如下:
if(typeof(EventSource) !== "undefined") {
var source = new EventSource("url");
source.onmessage = function(event) {
document.getElementById("result").innerHTML = event.data;
};
永远不会执行onMessage块。我的客户端代码有什么问题吗?
任何帮助表示赞赏!在此先感谢:)