ActiveMQ 消息驱动 bean 到 JSF

发布于 2024-09-10 18:22:01 字数 177 浏览 7 评论 0原文

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

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

谢谢

I am currently reading from ActiveMQ with a Message driven bean (EJB3) in the back end. The problem I am facing is that I have to update a table in my JSF page as soon as I receive the message from ActiveMQ in the message driven bean.

Any suggestions of the technologies I can try would be great. I am currently using primefaces and glassfish.

Thx

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

罪#恶を代价 2024-09-17 18:22:01

您可以使用 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 了解更多详细信息。

You could use primefaces poll to periodically check if there are new messages

<h:form>  
     <p:dataTable id="msgTable" var="msg" value="#{tableBean.messages} ">
     ...
     </p:dataTable>

     <p:poll interval="3"   
             actionListener="#{mdBean.messagesAvailable}" update="msgTable" />  
</h:form> 

See http://97.107.138.40:8080/prime-showcase/ui/ajaxPollHome.jsf for more detail.

野心澎湃 2024-09-17 18:22:01

您实际上无法直接从消息驱动 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

You cannot really call a (JSF) managed bean method directly from a message driven bean, since the scopes and times during which they are active are completely different.

The managed bean basically is active during an HTTP request. Afterwards its state might still be stored somewhere (i.e. if application, session or conversation scope is used), but it's not actively doing anything.

What you could do is use a technology like Comet, where you basically suspend the request from the backing bean. You can then let the backing bean wait for something before resuming the request again. You can let the managed bean listen to the same JMS queue that the message driven bean is listening to (assuming JMS is used), or you can let the managed bean listen to the CDI event bus. As soon as the MDB receives something from ActiveMQ, the MDB can put this on the CDI event bus and the backing bean will receive it.

In effect the MDB is then functioning as a bridge component.

There were a few presentations on Devoxx '10 that demonstrated something quite similar to what you are asking.

I think among others this presentation went into that stuff: http://www.adam-bien.com/roller/abien/entry/pets_and_aliens_running_on

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文