泽西岛 SSE 不适用于 Tomcat 7
Jersey SSE not working with Tomcat 7
很沮丧,我发布了这个问题。我确信我已经浏览了足够多的内容,知道到目前为止还没有讨论正确的答案。但如果情况相反,请接受我的道歉并与我分享 apt 论坛 link.
我正在使用 Jersey SSE 测试 SSE 广播的概念 API。
我没有使用 Maven 或任何东西。因为我正在做的宠物项目,在我熟悉 Maven 之前就开始了,所以我手动将 Jar 文件添加到 Web-Inf lib 文件夹
我有以下相关的jar-
2/28/2016 06:58 PM 85,147 javax.json-1.0.4.jar
12/28/2016 06:58 PM 85,353 javax.servlet-api-3.0.1.jar
12/28/2016 06:58 PM 115,534 javax.ws.rs-api-2.0.1.jar
12/28/2016 06:58 PM 100,146 jaxb-api-2.2.7.jar
12/28/2016 06:58 PM 117,090 jersey-client-2.2.jar
12/28/2016 06:58 PM 600,514 jersey-common-2.2.jar
12/28/2016 06:58 PM 52,819 jersey-container-servlet-core-2.2.jar
12/28/2016 06:58 PM 18,107 jersey-container-servlet.jar
12/28/2016 06:58 PM 971,310 jersey-guava-2.24.1.jar
12/28/2016 06:58 PM 30,495 jersey-media-sse.jar
12/28/2016 06:58 PM 801,094 jersey-server-2.2.jar
我的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>SDTP-SS-UK-ERP</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/struts/*</url-pattern>
</filter-mapping>
<!-- Jersey Support Configuration for RestFul WebServices -->
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<!-- <servlet-name>jersey-servlet</servlet-name> -->
<servlet-class>
org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.rest.services,com.sse.services</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>jersey-serlvet</servlet-name>
<!-- <servlet-name>jersey-servlet</servlet-name> -->
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
我的测试SSE注册文件。我用这个来注册 SSE:
@Singleton
@Path("/sse")
public class SseTest extends ResourceConfig
{
public SseTest() {
super(SseTest.class, SseFeature.class);
}
public SseBroadcaster BROADCASTER = new SseBroadcaster();
@GET
@Path("/getSSE")
@Produces(SseFeature.SERVER_SENT_EVENTS)
public EventOutput getMessageQueue()
{
EventOutput eventOutput = new EventOutput();
this.BROADCASTER.add(eventOutput);
System.out.println(eventOutput.toString());
return eventOutput;
}
//这个注册后,我通过另一个服务触发广播-
@GET
@Path("/test2/{id}")
@Produces(MediaType.TEXT_PLAIN)
//@Consumes(MediaType.TEXT_PLAIN)
public String addMessage(@PathParam("id") final String msg) throws IOException
{
String misg= msg+"\n\n";
OutboundEvent.Builder eventBuilder = new OutboundEvent.Builder();
OutboundEvent event = eventBuilder.mediaType(MediaType.TEXT_PLAIN_TYPE).data(String.class, misg).build();
System.out.println(event.getData());
BROADCASTER.broadcast(event);
return "Message '" + msg + "' has been broadcast.";
}
现在我将分享在 Chrome 或 firefox:
中发生的事情
当我调用服务 getSSE 时,浏览器正在注册事件流,甚至在网络详细信息中有一个带有空白 table- id、type、data 的选项卡 eventStream。
当我调用服务 /test2/10 时,它显示 200 OK 并且响应显示在浏览器中。
在 getSSE 选项卡中,第一个 getSSE 显示为已完成,另一个 getSSE 显示为待处理。
但是事件源数据仍然为零。
在这里调用了两次test2后的结果是:
getSSE 200 事件源sse.html:-Infinity 149 B 35.41 s
getSSE 200 eventsource 其他 149 B 11.0 min
getSSE 200 eventsource 其他 144 B Pending
有人可以指出为什么我收不到数据吗?我在服务器端 Java.
中没有收到任何运行时错误
服务器是Tomcat7.0.69
Java 是 JDK 1.7
请帮助我完成这项工作.. 由于好奇我哪里出错了,我正在失眠
问题已解决
库版本问题
很沮丧,我发布了这个问题。我确信我已经浏览了足够多的内容,知道到目前为止还没有讨论正确的答案。但如果情况相反,请接受我的道歉并与我分享 apt 论坛 link.
我正在使用 Jersey SSE 测试 SSE 广播的概念 API。
我没有使用 Maven 或任何东西。因为我正在做的宠物项目,在我熟悉 Maven 之前就开始了,所以我手动将 Jar 文件添加到 Web-Inf lib 文件夹
我有以下相关的jar-
2/28/2016 06:58 PM 85,147 javax.json-1.0.4.jar
12/28/2016 06:58 PM 85,353 javax.servlet-api-3.0.1.jar
12/28/2016 06:58 PM 115,534 javax.ws.rs-api-2.0.1.jar
12/28/2016 06:58 PM 100,146 jaxb-api-2.2.7.jar
12/28/2016 06:58 PM 117,090 jersey-client-2.2.jar
12/28/2016 06:58 PM 600,514 jersey-common-2.2.jar
12/28/2016 06:58 PM 52,819 jersey-container-servlet-core-2.2.jar
12/28/2016 06:58 PM 18,107 jersey-container-servlet.jar
12/28/2016 06:58 PM 971,310 jersey-guava-2.24.1.jar
12/28/2016 06:58 PM 30,495 jersey-media-sse.jar
12/28/2016 06:58 PM 801,094 jersey-server-2.2.jar
我的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>SDTP-SS-UK-ERP</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/struts/*</url-pattern>
</filter-mapping>
<!-- Jersey Support Configuration for RestFul WebServices -->
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<!-- <servlet-name>jersey-servlet</servlet-name> -->
<servlet-class>
org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.rest.services,com.sse.services</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>jersey-serlvet</servlet-name>
<!-- <servlet-name>jersey-servlet</servlet-name> -->
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
我的测试SSE注册文件。我用这个来注册 SSE:
@Singleton
@Path("/sse")
public class SseTest extends ResourceConfig
{
public SseTest() {
super(SseTest.class, SseFeature.class);
}
public SseBroadcaster BROADCASTER = new SseBroadcaster();
@GET
@Path("/getSSE")
@Produces(SseFeature.SERVER_SENT_EVENTS)
public EventOutput getMessageQueue()
{
EventOutput eventOutput = new EventOutput();
this.BROADCASTER.add(eventOutput);
System.out.println(eventOutput.toString());
return eventOutput;
}
//这个注册后,我通过另一个服务触发广播-
@GET
@Path("/test2/{id}")
@Produces(MediaType.TEXT_PLAIN)
//@Consumes(MediaType.TEXT_PLAIN)
public String addMessage(@PathParam("id") final String msg) throws IOException
{
String misg= msg+"\n\n";
OutboundEvent.Builder eventBuilder = new OutboundEvent.Builder();
OutboundEvent event = eventBuilder.mediaType(MediaType.TEXT_PLAIN_TYPE).data(String.class, misg).build();
System.out.println(event.getData());
BROADCASTER.broadcast(event);
return "Message '" + msg + "' has been broadcast.";
}
现在我将分享在 Chrome 或 firefox:
中发生的事情当我调用服务 getSSE 时,浏览器正在注册事件流,甚至在网络详细信息中有一个带有空白 table- id、type、data 的选项卡 eventStream。
当我调用服务 /test2/10 时,它显示 200 OK 并且响应显示在浏览器中。
在 getSSE 选项卡中,第一个 getSSE 显示为已完成,另一个 getSSE 显示为待处理。 但是事件源数据仍然为零。
在这里调用了两次test2后的结果是:
getSSE 200 事件源sse.html:-Infinity 149 B 35.41 s
getSSE 200 eventsource 其他 149 B 11.0 min
getSSE 200 eventsource 其他 144 B Pending
有人可以指出为什么我收不到数据吗?我在服务器端 Java.
中没有收到任何运行时错误服务器是Tomcat7.0.69 Java 是 JDK 1.7
请帮助我完成这项工作.. 由于好奇我哪里出错了,我正在失眠
问题已解决
库版本问题