我已经使用PrimePush成功配置了我的webapp,它构建了&部署没有错误。当我试图从我的支持bean“推”时,我没有得到任何错误,但是我的客户,从我所知道的,从未收到它。
我的设置:virgo3.0.3 / tomcat 7. PF 3.5,Atmosphere 2.0.1。 (我之前使用的是PF 3.5用户指南中所述的版本,但我遇到了构建和部署错误 - see my other question here。)
Web.xml中
<servlet>
<servlet-name>Push Servlet</servlet-name>
<servlet-class>org.primefaces.push.PushServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Push Servlet</servlet-name>
<url-pattern>/primepush/*</url-pattern>
</servlet-mapping>
Bean.java
public void eventHappened()
{
//SOMETHING HAS HAPPENED, LET THE CLIENT KNOW!
pushContext.push("/notification", "a message");
log.debug("I HAVE JUST SENT A PUSH");
}
客户页面
<h:body>
<h:form>
<!--SOME UI ELEMENTS ETC -->
<h:form>
<p:socket channel="/notification" autoConnect="false" onMessage="handleMessage"/>
<script type="text/javascript">
function handleMessage(data) {
alert("yay");
}
</script>
<h:body>
现在,在我的日志文件中,我成功看到了I HAVE JUST SENT A PUSH
,虽然浏览器上没有显示任何警报,但我的日志中没有错误。
现在,我对PF来说相对较新,所以很可能缺少一些基本的东西,不过几个小时的搜索线程和StackOverflow还没有为我提供任何解决方案。
我遇到的是,当我在解码后查看源代码时,呈现的javascript如下:
<script type="text/javascript">$(function() {widget_j_idt95 = new PrimeFaces.widget.Socket({url:'/myProjectContextPath/primepush/notification',autoConnect:false,transport:'websocket',fallbackTransport:'long-polling',onMessage:handleMessage});});</script>
仔细观察:
PrimeFaces.widget.Socket({url:'/myProjectContextPath/primepush/notification'
由于我声明了我的网址格式,<url-pattern>/primepush/*</url-pattern>
我认为客户端正在监听与服务器发送的信道不同的通道。所以我改变了<url-pattern>/myProjectContextPath/primepush/*</url-pattern>
。但是,这不是一个解决方案。
提前感谢您的帮助!
更新
正如我之前所说,我可能错过了一些基本的东西。我将javascript移到我的<h:head>
我的(有点)高兴,我现在在我的Chrome控制台上出现错误(在页面加载时),我在其他主题上看到过:
Websocket closed, reason: Connection was closed abnormally (that is, with no close frame being sent). push.js.xhtml?ln=primefaces:1
Websocket closed, wasClean: false push.js.xhtml?ln=primefaces:1
Websocket failed. Downgrading to Comet and resending
现在,在搜索了这个错误之后,解决方案似乎是在Glassfish上启用“Comet和Websockets”。现在,我知道我说我的设置是使用Glassfish,但是,我认为我们只是使用它的库 - (我对Maven,OSGI等很新),我们使用tomcat / virgo部署webapp,并且出于某种原因,我们将Glassfish作为依赖。
我已经搜索过如何启用Comets和Websockets,但是我的搜索并没有真正解释如何解释。
我想知道是否有人可以解释我如何启用它们或我的下一步应该是什么?