我正在开发在我的本地Glassfish3 安装上运行的 Java EE 6 企业应用程序。我的一个 EJB 需要向位于 Internet 某处的远程JMS 代理发送消息。
不幸的是,Internet 连接相当不可靠,所以我的想法是先将消息发送到本地Glassfish 自己的 JMS Broker。然后,我的本地代理会将消息转发到远程代理。如果互联网连接不可用,本地代理将简单地等待连接恢复。
我是否正确假设这会起作用?如果是这样,我将非常感谢一些如何开始的想法。
我正在开发在我的本地Glassfish3 安装上运行的 Java EE 6 企业应用程序。我的一个 EJB 需要向位于 Internet 某处的远程JMS 代理发送消息。
不幸的是,Internet 连接相当不可靠,所以我的想法是先将消息发送到本地Glassfish 自己的 JMS Broker。然后,我的本地代理会将消息转发到远程代理。如果互联网连接不可用,本地代理将简单地等待连接恢复。
我是否正确假设这会起作用?如果是这样,我将非常感谢一些如何开始的想法。
这种方法非常适用于这种情况(当远程端点并不总是可用时)并且被称为“存储转发”消息传递。事实上,许多应用服务器开箱即用地支持这一点,例如 WebLogic 和他的Store and Forward服务:
SAF 服务使 WebLogic Server 能够在分布在 WebLogic Server 实例上的应用程序之间可靠地传递消息。例如,使用 SAF 服务,在本地 WebLogic Server 实例上运行或连接到本地 WebLogic Server 实例的应用程序可以可靠地将消息发送到位于远程服务器上的端点。如果由于网络问题或系统故障而在发送消息时目的地不可用,则消息将保存在本地服务器实例上,并在可用时转发到远程端点。
在Open MQ(GlassFish 的 JMS 实现)的情况下,我知道存储和转发消息在功能计划中(参见2007 年的此演示文稿)。但是我很难找到一个确切的状态(像这样的消息并没有真正澄清情况)。可以肯定的是,GlassFish v3 使用 Open MQ 4.4,而 Open MQ 4.4具有 JMS 桥接器(存储和转发所需的),您可以将其用于代理到代理的通信。请参阅这篇最近的博客文章,了解如何配置它(找不到 Open MQ 4.4 的文档!!)。就个人而言,我会在开发邮件列表上发布一条消息。
现在,如果这不是很清楚,或者如果您没有得到满意的答案,则始终可以编写一个自定义应用程序来使用消息并将它们转发给不同的代理,这并不复杂。基本上,存储和转发消息意味着为应用程序使用“本地”持久队列,并使用 MDB 来使用消息并将它们发送到远程 JMS 目标(在单个事务中)。这需要一些进一步的测试,但作为 JMS 客户端,处理转发的 MDB 应该能够透明地重新连接到远程目标。
当客户端(生产者或消费者)不可靠时, JMS 非常适合,但如果代理本身不可靠,您就有麻烦了。
您可以尝试使用“暂存”代理的重新传递参数(超时、重试次数等)。但是,您仍然需要一个充当转发器的虚拟 MDB:声明代理尝试向虚拟 MDB 传递,该虚拟 MDB 尝试连接外部代理。如果不能,则事务失败并且消息保留在临时代理中。然后,声明代理稍后将尝试将消息重新传递到虚拟 MDB。
在 MDB 无法将消息转发到“外部”代理的情况下,“登台”代理的重新传递功能可以帮助管理连接问题。但请注意,在某个时间点,消息可能会进入“暂存”代理的死消息队列 (DMQ),甚至会被丢弃,具体取决于它的配置方式。
但这对我来说仍然听起来有点奇怪......