Java ActiveMQ消息驱动bean到JSF

Java ActiveMQ消息驱动bean到JSF,java,jsf,primefaces,activemq,message-driven-bean,Java,Jsf,Primefaces,Activemq,Message Driven Bean,我目前正在使用后端的消息驱动bean(EJB3)阅读ActiveMQ。我面临的问题是,我必须在消息驱动bean中从ActiveMQ接收到消息后立即更新JSF页面中的表 任何关于我可以尝试的技术的建议都会很好。我目前正在使用primefaces和glassfish Thx您可以使用primefaces轮询定期检查是否有新消息 <h:form> <p:dataTable id="msgTable" var="msg" value="#{tableBean.messag

我目前正在使用后端的消息驱动bean(EJB3)阅读ActiveMQ。我面临的问题是,我必须在消息驱动bean中从ActiveMQ接收到消息后立即更新JSF页面中的表

任何关于我可以尝试的技术的建议都会很好。我目前正在使用primefaces和glassfish


Thx

您可以使用primefaces轮询定期检查是否有新消息

<h:form>  
     <p:dataTable id="msgTable" var="msg" value="#{tableBean.messages} ">
     ...
     </p:dataTable>

     <p:poll interval="3"   
             actionListener="#{mdBean.messagesAvailable}" update="msgTable" />  
</h:form> 

...
有关更多详细信息,请参阅。

您不能直接从消息驱动bean调用(JSF)托管bean方法,因为它们处于活动状态的范围和时间完全不同

托管bean在HTTP请求期间基本上是活动的。之后,它的状态可能仍然存储在某个地方(即,如果使用了应用程序、会话或会话作用域),但它并没有主动执行任何操作

您可以使用Comet之类的技术,基本上暂停来自支持bean的请求。然后,您可以让支持bean在再次恢复请求之前等待一些东西。您可以让托管bean侦听消息驱动bean正在侦听的同一JMS队列(假设使用了JMS),也可以让托管bean侦听CDI事件总线。一旦MDB从ActiveMQ接收到某些内容,MDB就可以将其放在CDI事件总线上,并且支持bean将接收它

实际上,MDB是一个桥接组件

在Devxx'10上有一些演示,演示了一些与您要求的内容非常相似的内容


我认为,除此之外,本次演讲涉及到了以下内容:

感谢您的回复。最后,我使用primefaces poll并通过p:push方法通知其他客户机,以便同时通知所有人。然而,这并不理想。理想情况应该是MDB的onmessage()方法应该做一些事情来通知页面应该更新的所有客户端,但是我不知道如何从消息驱动bean调用托管bean后端方法或类似方法。我将activeMQ和MDB实现为一种警报机制,以避免每隔几秒钟从每个客户端轮询数据库。发送给客户端的ActiveMQ消息…客户端检查数据库。