Jakarta ee 如何使用Glassfish';s JMS经纪人至;委托书;将消息发送到internet上的JMS代理?

Jakarta ee 如何使用Glassfish';s JMS经纪人至;委托书;将消息发送到internet上的JMS代理?,jakarta-ee,glassfish,jms,java-ee-6,glassfish-3,Jakarta Ee,Glassfish,Jms,Java Ee 6,Glassfish 3,我正在开发一个在本地Glassfish3安装上运行的JavaEE6企业应用程序。我的一个EJB需要向位于Internet某处的远程JMS代理发送消息 不幸的是,Internet连接相当不可靠,因此我的想法是首先将消息发送到本地Glassfish自己的JMS代理。然后,我的本地代理将消息转发给远程代理。如果internet连接不可用,本地代理只需等待连接恢复即可 我认为这会起作用,对吗?如果是这样的话,我将非常感谢一些如何开始的想法。当客户(生产者或消费者)不可靠时,JMS非常适合,但如果经纪人本

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

不幸的是,Internet连接相当不可靠,因此我的想法是首先将消息发送到本地Glassfish自己的JMS代理。然后,我的本地代理将消息转发给远程代理。如果internet连接不可用,本地代理只需等待连接恢复即可


我认为这会起作用,对吗?如果是这样的话,我将非常感谢一些如何开始的想法。

当客户(生产者或消费者)不可靠时,JMS非常适合,但如果经纪人本身不可靠,您就有麻烦了

您可以尝试使用“staging”代理的重新交付参数(超时、重试次数等)。但是,您仍然需要一个充当forwarer的虚拟MDB:声明代理尝试传递给试图连接外部代理的虚拟MDB。如果不能,事务将失败,消息将保留在暂存代理中。声明代理随后将尝试将消息重新传递给虚拟MDB

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


但这听起来还是有点奇怪

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

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

在(GlassFish的JMS实现)的案例中,我知道存储和转发消息在功能计划中(参见2007年)。但我很难找到这方面的确切情况(比如,消息没有真正澄清情况)。可以肯定的是,GlassFish v3使用OpenMQ4.4,并具有JMS桥(存储和转发需要JMS桥),您可以使用它进行代理到代理的通信。请参阅如何配置它(找不到Open MQ 4.4!!)的文档)。就我个人而言,我会在dev邮件列表上发布一条消息


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

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