如何检测 JMS 主题连接丢失

Posted

技术标签:

【中文标题】如何检测 JMS 主题连接丢失【英文标题】:How to detect loss of JMS Topic connection 【发布时间】:2014-01-03 06:36:12 【问题描述】:

我们有连接到服务器进程的摆动 GUI 客户端。

客户端使用在 Camel 路由中定义的 jms:queue 'from' 端点在服务器上“调用”服务,并使用 ActiveMQ 作为底层 JMS 代理。

但是,客户端也提供了一个 Camel jms:topic 端点,供服务器将消息广播回客户端。

不幸的是,主题连接似乎不知何故丢失了,尽管客户端仍然可以“调用”服务器上的服务,但服务器无法向客户端的主题端点发送任何消息。

Camel端点的客户端spring定义如下:

    <camel:route>
        <camel:from uri="jms:topic:inUseQueue"/>
        <camel:to uri="bean:inUseInterfaceImpl"/>
    </camel:route>

而服务端生产者定义如下:

<bean id="inUseManagerImpl" class="org.apache.camel.spring.remoting.CamelProxyFactoryBean">
  <property name="serviceUrl" value="jms:topic:inUseQueue"/>
  <property name="serviceInterface" value="uniworks.core.inuse.InUseInterface"/>
</bean>

有谁知道我们可以在客户端检测到此主题连接丢失的方法吗?

【问题讨论】:

自从我提出这个问题后,这个问题就没有再次出现,所以我相信这只是某种暂时性的问题,我们已经以某种方式解决了。 【参考方案1】:

一个简单的解决方法是覆盖CamelProxyFactoryBeanisSingleton() 方法。返回 false 并让 spring 在每次调用时创建生产者 bean,而不是缓存它。或者您也可以将CamelProxyFactoryBean 的范围定义为原型。

您也可以尝试使用支持连接池的ActiveMQcamel 组件。

【讨论】:

【参考方案2】:

我意识到这是一个 8 个月大的问题,但是,这到底是怎么回事。

让服务器每分钟广播一次“isalive”消息是否有意义,这样如果客户端没有收到任何“isalive”消息,它可以假定它已断开连接。

【讨论】:

是的,这是可以做到的。但是,我们已经设计了系统,以便在客户端仍然“登录”时可以关闭并重新启动服务器,因此当服务器“重新启动”(几分钟)时,客户端会认为它是 JMS 的一侧'管道'已丢失。自从我提出这个问题后,最初的问题就没有再次出现,所以我认为这是某种暂时的问题。

以上是关于如何检测 JMS 主题连接丢失的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 JMS 连接是不是存在?

Mule 2.2.6 - 处理 JMS 连接丢失的策略

在 WildFly 中配置/注入 JMS 连接工厂和主题

如何检测套接字连接何时丢失?

我可以使用 Python3.6 Sanic 在 websockets 中检测到“连接丢失”吗?

ActiveMQ JMS 主题 - 删除旧消息