我正在使用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连接到&#39; ws://example.com/primepush/service/push?X-Atmosphere-tracking-id = 0&amp; X-Atmosphere-Framework = 2.2.4-javascript&amp; X-Atmosphere-运输=网页套接字&安培; X - 大气-TrackMessageSize =真安培; X-ATMO协议=真&#39;失败:WebSocket握手期间出错:意外响应代码:501
发生此错误后,还有另一条错误消息
Websocket失败了。降级为Comet并重新发送push.js.xhtml?ln = primefaces&amp; v = 5.1:1 无法加载资源:服务器响应状态为501(未实施)http://example.com/primepush/service/push?X-Atmos ... ng&amp; X-Atmosphere-TrackMessageSize = true&amp; X-atmo-protocol = true&amp; _ = 1422008343786
在检查两个错误消息时,我发现p:socket组件失败并且传输为&#39; WebSocket&#39;并且它正在尝试使用长期投票&#39;这没有实现。所以我的问题是AWS是否支持&#39; WebSocket&#39;如果没有解决方法是什么?
答案 0 :(得分:1)
目前AWS不支持WebSocket。我们的工作是使用AWS EB负载均衡器和TCP / SSL。我通过在loadbalancer配置中将协议从HTTP更改为TCP来实现此目的。但这不能单独工作,需要告诉beanstalk在websocket的情况下直接与tomcat通信。这可以使用配置文件来完成,该配置文件可以按照this post。
中的指定添加答案 1 :(得分:-1)
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