【问题标题】:How can I share events with EventBus in different webapps?如何在不同的 web 应用中与 EventBus 共享事件?
【发布时间】:2012-10-05 14:58:19
【问题描述】:
我正在使用 tomcat。我想把番石榴罐和我自己的罐子放在 tomcat/lib 中。我的 jar 有一个工厂来获取事件总线,并且所有 webapps 都可以访问该工厂。我不知道如何在 webapp1 中注册一个侦听器并从 webapp2 发布一个事件。我在 webapp2 中使用的对象在 webapp1 中不存在,我只能共享 java 对象,如字符串、字符串映射等,但不能共享来自其他 webapp 的对象。
一些想法?
【问题讨论】:
标签:
java
tomcat
guava
event-bus
【解决方案1】:
这是一个类加载问题:很可能,webapp1 的域类在 webapp2 中不(也不应该)可用。相信我,当我说你不想在 webapps 之间共享活动对象时。
如果您想共享数据,请考虑使用适当的 JMS(或其他类似的消息传递库),如果您想共享行为,请使用 REST 服务。仅提及简单的常见解决方案。
话虽如此,如果你真的需要去那里,你可以把你想共享的类放在一个 jar 中,然后把这个和番石榴放在服务器范围的类路径中 + 支付额外费用注意部署过程,因为您创建了内存泄漏。 (不过,每次你使用那种讨厌的 hack,上帝会杀死一只小猫)
【解决方案2】:
Guava 的EventBus 仅适用于单个应用程序中的事件。它绝对不是用于应用程序或服务器之间的通信(至少不是直接的)。您也绝对不应该依赖于您当前在同一个 Tomcat 实例中运行两个 webapps 的事实,因为这可能是您在某个时候想要更改的内容。正如建议的那样,更好的解决方案是一个消息库,用于在 JMS 等应用程序/服务器之间进行通信。