Primepush ...无法建立连接,Websocket关闭,原因:连接异常关闭

时间:2012-11-27 01:41:05

标签: firefox google-chrome primefaces glassfish-3 atmosphere

我正在使用:

的Linux
PrimeFaces 3.4.1
Glassfish 3.1.2.2(构建5,启用彗星,禁用websockets)
FireFox 10.0.7
铬22.0.1229.94

我在消息驱动的bean中有PrimePush。当调用我的MDB的onMessage()时(应该是每秒几次),我期待出现咆哮通知。此外,不确定这是否重要,但MDB位于* .ear内的* .jar文件中,而Web应用程序也位于* .war内部。我在MDB中有PrimePush,如下所示。

pushContext = PushContextFactory.getDefault().getPushContext();
pushContext.push("/notifications",
    new FacesMessage("Hello World", "New Notification"));

这是我的web.xml。

<servlet>
    <servlet-name>Push Servlet</servlet-name>
    <servlet-class>org.primefaces.push.PushServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Push Servlet</servlet-name>
    <url-pattern>/primepush/*</url-pattern>
</servlet-mapping>

问题是当我第一次将所有东西都清理干净(玻璃鱼,浏览器)时会发出一次通知,但通常不再出现或者每次调用pushContext.push()。使用FF,它甚至不会工作一次。当MDB onMessage()触发时,我很快就会在firefox错误控制台中收到以下内容。

Error: Firefox can't establish a connection to the server at ws://localhost:8080/test/primepush/notifications?X-Atmosphere-tracking-id=0&X-Atmosphere-Framework=1.0&X-Atmosphere-Transport=websocket&X-Cache-Date=0.
Source File: http://localhost:8080/test/javax.faces.resource/push/push.js.xhtml?ln=primefaces
Line: 1  

使用Chrome,它至少可以运行一次,有时但不可靠。每次加载网页时,我都会看到连接已关闭(就像我正在加载页面一样)。这是在错误控制台内。

Unexpected response code: 200 :8080:1
Websocket closed, reason: Connection was closed abnormally (that is, with no close frame being sent). push.js.xhtml:1
Websocket closed, wasClean: false push.js.xhtml:1
Websocket failed. Downgrading to Comet and resending  

这是我的text.xhtml页面。

<p:growl widgetVar="growl" showDetail="true"/>

<h:form id="myform">
    <p:fieldset id="myfs" legend="Push Test">
        <!-- stuff -->
    </p:fieldset>
</h:form>

<script type="text/javascript">
    function handleMessage(data) {
        data.severity = 'info';
        growl.show([data]);
    }
</script>

<p:socket onMessage="handleMessage" channel="/notifications">
</p:socket>

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,并且在glassfish中启用websockets解决了我的问题(在启用了comet-support-enabled之后将以下内容添加到domain.xml):

websockets-support-enabled="true"

提示是这样的:

Websocket failed. Downgrading to Comet and resending  

根据此处的文档http://www.primefaces.org/docs/vdl/3.4/primefaces-p/socket.html,websocket是primepush中使用的默认方式,需要在glassfish中启用websockets。我认为在p:socket中设置传输到comet(long-poll / stream)也可能有用。

BTW,我测试过:

Mac
PrimeFaces 3.4.2 with Atmosphere 1.0.8
Glassfish 3.1.2 (with comet enabled, websockets enabled)
FireFox 18
Chromium 24