我目前正在使用后端的消息驱动 bean (EJB3) 从 ActiveMQ 中读取数据。我面临的问题是,我必须在消息驱动 bean 中收到来自 ActiveMQ 的消息后立即更新 JSF 页面中的表。
我可以尝试的技术的任何建议都会很棒。我目前正在使用 primefaces 和 glassfish。
谢谢
我目前正在使用后端的消息驱动 bean (EJB3) 从 ActiveMQ 中读取数据。我面临的问题是,我必须在消息驱动 bean 中收到来自 ActiveMQ 的消息后立即更新 JSF 页面中的表。
我可以尝试的技术的任何建议都会很棒。我目前正在使用 primefaces 和 glassfish。
谢谢
您可以使用 primefaces poll 定期检查是否有新消息
<h:form>
<p:dataTable id="msgTable" var="msg" value="#{tableBean.messages} ">
...
</p:dataTable>
<p:poll interval="3"
actionListener="#{mdBean.messagesAvailable}" update="msgTable" />
</h:form>
有关详细信息,请参阅http://97.107.138.40:8080/prime-showcase/ui/ajaxPollHome.jsf 。
您不能真正从消息驱动 bean 中直接调用 (JSF) 托管 bean 方法,因为它们处于活动状态的范围和时间完全不同。
托管 bean 在 HTTP 请求期间基本上是活动的。之后它的状态可能仍然存储在某个地方(即,如果使用应用程序、会话或会话范围),但它并没有主动做任何事情。
您可以做的是使用像 Comet 这样的技术,您基本上可以暂停来自支持 bean 的请求。然后,您可以让支持 bean 在再次恢复请求之前等待某些东西。您可以让托管 bean 侦听消息驱动 bean 正在侦听的同一 JMS 队列(假设使用 JMS),或者您可以让托管 bean 侦听 CDI 事件总线。一旦 MDB 从 ActiveMQ 接收到一些东西,MDB 就可以将它放在 CDI 事件总线上,并且支持 bean 将接收它。
实际上,MDB 起到了桥接组件的作用。
有一些关于 Devoxx '10 的演示文稿展示了与您所要求的内容非常相似的内容。
我认为除其他外,该演示文稿涉及到这些内容: http: //www.adam-bien.com/roller/abien/entry/pets_and_aliens_running_on