bean-компонент ActiveMQ, управляемый сообщениями, в JSF

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

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

Спасибо


person Jaco de Villiers    schedule 23.07.2010    source источник


Ответы (2)


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

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

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

По сути, MDB функционирует как мостовой компонент.

На Devoxx '10 было несколько презентаций, которые демонстрировали нечто очень похожее на то, о чем вы спрашиваете.

Я думаю, среди прочего, эта презентация была посвящена этим вещам: bien.com/roller/abien/entry/pets_and_aliens_running_on

person Arjan Tijms    schedule 05.12.2010

Вы можете использовать опрос 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 для более подробной информации.

person Jose Diaz    schedule 24.07.2010
comment
Спасибо за ответ. В итоге я использовал опрос Primefaces и оповещал других клиентов с помощью метода p:push, чтобы оповещать всех одновременно. Однако это не идеально. В идеале метод onmessage() в MDB должен делать что-то, чтобы уведомить всех клиентов о том, что страница должна быть обновлена, но я не знаю, как вызвать внутренний метод управляемого компонента или аналогичный из компонента, управляемого сообщениями. Я реализовал ActiveMQ и MDB в качестве механизма оповещения, чтобы не опрашивать базу данных каждые несколько секунд от каждого клиента. Сообщение ActiveMQ клиенту... клиент проверяет базу данных. - person Jaco de Villiers; 02.08.2010