【问题标题】:PrimeFaces push with AWSPrimeFaces 使用 AWS 推送
【发布时间】:2015-03-22 10:28:54
【问题描述】:

我正在使用 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 连接到 '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' 失败:WebSocket 握手期间出错:意外响应代码:501

在这个错误之后有另一个错误消息

Websocket 失败。降级到 Comet 并重新发送 push.js.xhtml?ln=primefaces&v=5.1:1 加载资源失败:服务器响应状态为 501(未实现)http://example.com/primepush/service/push?X-Atmos...ng&X-Atmosphere-TrackMessageSize=true&X-atmo-protocol=true&_=1422008343786

在检查这两个错误消息时,我发现 p:socket 组件在传输为“WebSocket”时失败,它正在尝试使用未实现的“长轮询”。所以我的问题是 AWS 是否支持“WebSocket”,如果不是,那么解决方法是什么?

【问题讨论】:

  • 你有什么版本的氛围?
  • 我用的是大气2.2.4版

标签: amazon-web-services primefaces tomcat7 atmosphere amazon-elb


【解决方案1】:

AWS 目前不支持 WebSocket。解决方法是将 AWS EB 负载均衡器与 TCP/SSL 结合使用。我通过在负载均衡器配置中将协议从 HTTP 更改为 TCP 来做到这一点。但这不会单独工作,需要告诉 beanstalk 在 websocket 的情况下直接与 tomcat 通信。这可以使用配置文件来完成,该配置文件可以按照this 帖子中的指定添加。

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 我试过你的答案,但它不起作用。我使用的是 primefaces 5.1,所以根据文档我使用了大气 2.2.2。你在使用 AWS。我认为 AWS 不支持 Websocket。
    • 不,我不使用 AWS,但我的问题看起来很相似(类似症状),所以我尝试了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多