如何检测 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】:一个简单的解决方法是覆盖CamelProxyFactoryBean
的isSingleton()
方法。返回 false 并让 spring 在每次调用时创建生产者 bean,而不是缓存它。或者您也可以将CamelProxyFactoryBean
的范围定义为原型。
您也可以尝试使用支持连接池的ActiveMQcamel 组件。
【讨论】:
【参考方案2】:我意识到这是一个 8 个月大的问题,但是,这到底是怎么回事。
让服务器每分钟广播一次“isalive”消息是否有意义,这样如果客户端没有收到任何“isalive”消息,它可以假定它已断开连接。
【讨论】:
是的,这是可以做到的。但是,我们已经设计了系统,以便在客户端仍然“登录”时可以关闭并重新启动服务器,因此当服务器“重新启动”(几分钟)时,客户端会认为它是 JMS 的一侧'管道'已丢失。自从我提出这个问题后,最初的问题就没有再次出现,所以我认为这是某种暂时的问题。以上是关于如何检测 JMS 主题连接丢失的主要内容,如果未能解决你的问题,请参考以下文章