2010-07-23 110 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