PrimeFaces 使用 AWS 推送
PrimeFaces push with AWS
我正在使用 PrimeFaces 5.0 和 tomcat 7,我的应用程序在 AWS 中。
我正在尝试使用 PrimeFaces 推送。我已经实现了一个示例应用程序,它正在与我的本地系统一起工作。如果我将代码部署到 AWS,它会失败。
Xhtml代码
<p:socket onMessage="jsFunctionToCall" channel="/service/push"/>
Web.xml
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>org.atmosphere.cpr.AtmosphereInterceptor</param-name>
<param-value>org.atmosphere.interceptor.ShiroInterceptor</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Push Servlet</servlet-name>
<servlet-class>org.primefaces.push.PushServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>Push Servlet</servlet-name>
<url-pattern>/primepush/*</url-pattern>
</servlet-mapping>
Java代码
@PushEndpoint("/service/push")
public class ServicePushResource {
@OnMessage(encoders = {JSONEncoder.class})
public String onMessage(String count) {
return count;
}
}
推送消息:
EventBus eventBus = EventBusFactory.getDefault().eventBus();
eventBus.publish("/service/push", String.valueOf("msg"));
我收到
的错误消息
WebSocket connection to 'ws://example.com/primepush/service/push?X-Atmosphere-tracking-id=0&X-Atmosphere-Framework=2.2.4-javascript&X-Atmosphere-Transport=websocket&X-Atmosphere-TrackMessageSize=true&X-atmo-protocol=true' failed: Error during WebSocket handshake: Unexpected response code: 501
此错误后还有另一条错误消息
Websocket failed. Downgrading to Comet and resending push.js.xhtml?ln=primefaces&v=5.1:1
Failed to load resource: the server responded with a status of 501 (Not Implemented) http://example.com/primepush/service/push?X-Atmos…ng&X-Atmosphere-TrackMessageSize=true&X-atmo-protocol=true&_=1422008343786
在检查这两个错误消息时,我发现 p:socket 组件作为 'WebSocket' 传输失败,它正在尝试 'long-polling' ,但未实现。所以我的问题是 AWS 是否支持 'WebSocket' 如果不支持,解决方法是什么?
Primefaces 5.0 的文档说要使用 Atmosphere 2.1.3。当我尝试使用 2.2.x 版本时,我遇到了与您类似的问题。我使用的当前版本是 2.1.4,对我来说很好用。也许你也可以试试这个。
另一种情况是firefox浏览器抛出wss连接错误(不过primepush还是可以的)。
另请参考:
https://bugzilla.mozilla.org/show_bug.cgi?id=594502
目前 AWS 不支持 WebSocket。解决方法是将 AWS EB 负载均衡器与 TCP/SSL 一起使用。我通过在负载均衡器配置中将协议从 HTTP 更改为 TCP 来做到这一点。但这不会单独工作,需要告诉 beantalk 在 websocket 的情况下直接与 tomcat 通信。这可以使用配置文件来完成,该文件可以按照 this post.
中指定的方式添加
我正在使用 PrimeFaces 5.0 和 tomcat 7,我的应用程序在 AWS 中。 我正在尝试使用 PrimeFaces 推送。我已经实现了一个示例应用程序,它正在与我的本地系统一起工作。如果我将代码部署到 AWS,它会失败。
Xhtml代码
<p:socket onMessage="jsFunctionToCall" channel="/service/push"/>
Web.xml
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>org.atmosphere.cpr.AtmosphereInterceptor</param-name>
<param-value>org.atmosphere.interceptor.ShiroInterceptor</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Push Servlet</servlet-name>
<servlet-class>org.primefaces.push.PushServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>Push Servlet</servlet-name>
<url-pattern>/primepush/*</url-pattern>
</servlet-mapping>
Java代码
@PushEndpoint("/service/push")
public class ServicePushResource {
@OnMessage(encoders = {JSONEncoder.class})
public String onMessage(String count) {
return count;
}
}
推送消息:
EventBus eventBus = EventBusFactory.getDefault().eventBus();
eventBus.publish("/service/push", String.valueOf("msg"));
我收到
的错误消息WebSocket connection to 'ws://example.com/primepush/service/push?X-Atmosphere-tracking-id=0&X-Atmosphere-Framework=2.2.4-javascript&X-Atmosphere-Transport=websocket&X-Atmosphere-TrackMessageSize=true&X-atmo-protocol=true' failed: Error during WebSocket handshake: Unexpected response code: 501
此错误后还有另一条错误消息
Websocket failed. Downgrading to Comet and resending push.js.xhtml?ln=primefaces&v=5.1:1 Failed to load resource: the server responded with a status of 501 (Not Implemented) http://example.com/primepush/service/push?X-Atmos…ng&X-Atmosphere-TrackMessageSize=true&X-atmo-protocol=true&_=1422008343786
在检查这两个错误消息时,我发现 p:socket 组件作为 'WebSocket' 传输失败,它正在尝试 'long-polling' ,但未实现。所以我的问题是 AWS 是否支持 'WebSocket' 如果不支持,解决方法是什么?
Primefaces 5.0 的文档说要使用 Atmosphere 2.1.3。当我尝试使用 2.2.x 版本时,我遇到了与您类似的问题。我使用的当前版本是 2.1.4,对我来说很好用。也许你也可以试试这个。
另一种情况是firefox浏览器抛出wss连接错误(不过primepush还是可以的)。 另请参考: https://bugzilla.mozilla.org/show_bug.cgi?id=594502
目前 AWS 不支持 WebSocket。解决方法是将 AWS EB 负载均衡器与 TCP/SSL 一起使用。我通过在负载均衡器配置中将协议从 HTTP 更改为 TCP 来做到这一点。但这不会单独工作,需要告诉 beantalk 在 websocket 的情况下直接与 tomcat 通信。这可以使用配置文件来完成,该文件可以按照 this post.
中指定的方式添加