【问题标题】:ActiveMQ messagedriven bean to JSFActiveMQ 消息驱动 bean 到 JSF
【发布时间】:2010-07-23 10:15:44
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: java jsf primefaces activemq message-driven-bean


    【解决方案1】:

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

    【讨论】:

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

    您不能真正直接从消息驱动 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

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 2017-06-13
      • 2018-11-21
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多