如何使用Glassfish的JMS Broker将消息“代理”到Internet上的JMS代理?

时间:2010-01-28 14:40:25

标签: java-ee glassfish jms java-ee-6 glassfish-3

我正在研究在我的本地 Glassfish3安装上运行的Java EE 6企业应用程序。我的一个EJB需要将消息发送到位于Internet上某处的远程 JMS代理。

不幸的是,互联网连接相当不可靠,所以我的想法是首先将消息发送到本地 Glassfish自己的JMS代理。然后,我的本地代理会将消息转发给远程代理。如果互联网连接不可用,本地代理只会等到连接重新启动。

我认为这可行吗?如果是这样,我会非常感谢如何开始的一些想法。

2 个答案:

答案 0 :(得分:1)

这种方法对于这种情况(当远程端点并不总是可用时)完全有效,并且被称为“存储转发”消息传递。实际上,许多应用程序服务器都支持开箱即用,例如WebLogic和他的Store and Forward服务:

  

SAF服务使WebLogic Server能够在跨WebLogic Server实例分布的应用程序之间可靠地传递消息。例如,使用SAF服务,在本地WebLogic Server实例上运行或连接的应用程序可以可靠地将消息发送到驻留在远程服务器上的端点。如果在发送消息时目标不可用(由于网络问题或系统故障),则消息将保存在本地服务器实例上,并在消息可用后转发到远程端点。

Open MQ(GlassFish的JMS实现)的情况下,我知道存储转发消息在功能计划上(参见2007年的this presentation)。但是我有一些困难要找到确切的状态(像this one这样的消息并没有真正澄清情况)。可以肯定的是,GlassFish v3使用Open MQ 4.4而Open MQ 4.4具有JMS桥(存储和转发所需),您可以将它用于代理与代理通信。请参阅this recent blog post有关如何配置它的信息(找不到Open MQ 4.4的文档!!)。就个人而言,我会在开发邮件列表上发布一条消息。

现在,如果这不是很清楚,或者你没有得到令人满意的答案,那么总是可以编写一个自定义应用程序来使用消息并将它们转发给不同的代理,这并不复杂。基本上,存储和转发消息传递意味着为应用程序使用“本地”持久队列,并使用MDB来使用消息并将它们发送到远程JMS目标(在单个事务中)。这需要进行一些进一步的测试,但作为JMS客户端,处理转发的MDB应该能够透明地重新连接到远程目标。

答案 1 :(得分:0)

客户端(生产者或消费者)不可靠时,JMS非常适合,但在代理本身不可靠的情况下,您遇到麻烦。

您可以尝试使用“登台”代理的重新传递参数(超时,重试次数等)。但是,您仍然需要一个充当forwarer的虚拟MDB:说明代理尝试传递到尝试连接外部代理的虚拟MDB。如果它不能导致事务失败并且消息仍在暂存代理中。然后,说明代理将尝试将消息重新传递给虚拟MDB。

“暂存”代理的重新传递功能可以帮助管理连接问题,以防MDB无法将消息转发给“外部”代理。但要注意,在某个时间点,消息可能会进入“分段”代理的死消息队列(DMQ),甚至可能会被丢弃,具体取决于它的配置方式。

但这对我来说仍然有点奇怪......