【问题标题】:How can I use Glassfish's JMS Broker to "proxy" a message on to a JMS Broker on the internet?如何使用 Glassfish 的 JMS Broker 将消息“代理”到 Internet 上的 JMS Broker?
【发布时间】:2012-09-22 12:01:29
【问题描述】:

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

不幸的是,Internet 连接相当不可靠,所以我的想法是首先将消息发送到 本地 Glassfish 自己的 JMS 代理。然后,我的 local 代理会将消息转发到 remote 代理。如果 Internet 连接不可用,本地代理将等待连接恢复。

我是否正确假设这会起作用?如果是这样,我将非常感谢一些如何开始的想法。

【问题讨论】:

  • Ewernli 和 Pascal,非常感谢您的回复。他们帮助我了解了 OpenMQ 当前的局限性。我决定不使用虚拟 MDB 方法,而是使用本地 ActiveMQ 消息代理。目前,它似乎正在发挥作用。

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


【解决方案1】:

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

SAF 服务使 WebLogic Server 能够在跨 WebLogic Server 实例分布的应用程序之间可靠地传递消息。例如,使用 SAF 服务,在本地 WebLogic Server 实例上运行或连接到本地 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 应该能够透明地重新连接到远程目标。

【讨论】:

    【解决方案2】:

    JMS 非常适合 客户(生产者或消费者)不可靠的情况,但如果 代理 本身不可靠,您就有麻烦了。

    您可以尝试使用“暂存”代理的 redelivery 参数(超时、重试次数等)。但是,您仍然需要一个充当转发器的虚拟 MDB:声明代理尝试向虚拟 MDB 传递,该虚拟 MDB 尝试连接外部代理。如果不能,则事务失败并且消息保留在临时代理中。声明代理随后将尝试将消息重新传递到虚拟 MDB。

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

    但这对我来说还是有点奇怪......

    【讨论】:

      猜你喜欢
      • 2015-08-16
      • 1970-01-01
      • 2012-09-22
      • 2014-09-23
      • 2012-01-03
      • 1970-01-01
      • 2012-05-06
      • 2016-06-09
      • 2017-10-08
      相关资源
      最近更新 更多