2010-07-23 3 views
4

В настоящее время я читаю из ActiveMQ с ведомым сообщением bean (EJB3) в конце. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно обновить таблицу на моей странице JSF, как только я получу сообщение от ActiveMQ в бин, управляемом сообщениями.ActiveMQ messagedriven bean для JSF

Любые предложения по технологиям, которые я могу попробовать, были бы замечательными. В настоящее время я использую перфектуры и стеклянную рыбку.

Thx

ответ

0

Вы не можете назвать метод управляемых bean-компонентов (JSF) непосредственно из бина, управляемого сообщениями, поскольку области и моменты, в течение которых они активны, совершенно разные.

Управляемый компонент в основном активен во время HTTP-запроса. Впоследствии его состояние все еще может храниться где-то (то есть, если используется область приложения, сеанса или разговора), но он не делает ничего активного.

Что вы можете сделать, это использовать технологию, такую ​​как Comet, где вы в основном приостанавливаете запрос от бэкэнда. Затем вы можете позволить резервному компоненту ждать чего-то, прежде чем возобновлять запрос. Вы можете позволить управляемому компоненту прослушивать ту же очередь JMS, которую прослушивает бин, управляемый сообщением (при условии, что используется JMS), или вы можете позволить управляемому компоненту прослушивать шину событий CDI. Как только MDB получит что-то из ActiveMQ, MDB может поместить это на шину событий CDI, и бэк-компонент получит его.

Фактически, 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

Спасибо за ответ. Я закончил использование опроса primaries и предупредил других клиентов с помощью метода p: push, чтобы одновременно предупредить всех. Это, однако, не идеально. Идеал должен состоять в том, что метод onmessage() MDB должен что-то сделать, чтобы уведомить всех клиентов о том, что страница должна обновляться, но я не знаю, как вызвать метод управляемого управляемого bean-бэкэнд или аналогичный из бина, управляемого сообщениями. Я реализовал activeMQ и MDB как механизм предупреждения, чтобы не опробовать базу данных каждые несколько секунд от каждого клиента. Сообщение ActiveMQ для клиента ... клиент проверяет базу данных. –

Смежные вопросы