2010-07-23 112 views
4

我目前正在从ActiveMQ中读取后端的消息驱动Bean(EJB3)。我面临的问题是,只要在消息驱动Bean中从ActiveMQ收到消息,就必须更新JSF页面中的表。ActiveMQ消息驱动bean到JSF

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

THX

回答

0

你真的不能叫(JSF)直接从一个消息驱动bean管理bean的方法,由于在范围和时间,在此期间他们是积极的是完全不同的。

托管bean在HTTP请求期间基本上处于活动状态。之后,其状态可能仍然存储在某个地方(即,如果使用了应用程序,会话或对话范围),但它不会主动执行任何操作。

你可以做的是使用技术,如彗星,在那里你基本上暂停从支持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

2

你可以使用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> 

更多细节见http://97.107.138.40:8080/prime-showcase/ui/ajaxPollHome.jsf

+0

感谢您的回应。我最终使用primefaces轮询并通过p:push方法提醒其他客户端,以便同时提醒所有人。然而这并不理想。理想的情况应该是MDB的onmessage()方法应该做一些事情来通知页面应该更新的所有客户端,但我不知道从消息驱动Bean调用托管bean后端方法或类似方法。我实现了activeMQ和MDB作为警报机制,不会每隔几秒钟从每个客户端轮询数据库。 ActiveMQ消息给客户端...客户端检查数据库。 – 2010-08-02 04:28:45