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.

中指定的方式添加