我正在编写一个从队列中消耗的JMS客户端。如果重要的话,我的经纪人是activemq。
一个要求是即使代理已经关闭,客户端也应该启动。在这种情况下,它应该表现得好像队列中没有消息,并且一旦代理启动并且消息开始相应的行为。
问题在于我的代码:
connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start()
如果经纪人关闭,那么它会陷入connection.start()
。虽然我想要的是connection.start()
以静默方式返回并继续尝试在后台连接并消费消息,而不能消息。
我怎样才能做到这一点。
答案 0 :(得分:1)
使用单独的线程从队列中消耗并开始连接。您将需要使用并发队列实现。
主题1:
线程2(或某种类型的池):
答案 1 :(得分:1)
有两种方法可以解决此类情况,其中一种方法在AMQ-2114中有描述:
使用AMQ-2114中建议的代理URI。通过使用AMQ-2114中建议的代理URI,可以创建具有到远程代理的网络连接的嵌入式代理。但是,正如所指出的那样,该代理URI不使用故障转移连接器。
通过使用手动配置的嵌入式代理来使用代理网络。我过去曾使用过这种方法,在Java应用程序中嵌入了ActiveMQ代理实例,并且它配置了与远程代理的网络连接。这将允许您的客户端连接到嵌入式代理而不会挂起,并将消息发送到嵌入式代理。消息将从嵌入式代理流向远程代理,但仅当消费者需要远程代理上的消息时(即,消费者连接到远程代理并请求消息)。与嵌入式代理的连接可以使用故障转移传输,与远程代理的网络连接也可以使用故障转移传输。
我为此解决方案提供的示例是一个用例,是销售人员笔记本电脑上的Java应用程序。即使销售人员没有连接到他们的办公室网络,这样的应用程序也需要继续工作。这里的解决方案是在Java应用程序中嵌入代理,以便在发送消息时应用程序不会挂起,即使它没有连接到办公室网络。当应用程序再次连接到办公室网络时,它将自动连接到另一个代理并且消息将流动。
布鲁斯
答案 2 :(得分:1)
为了后人,我强烈建议使用Spring的DefaultMessageListenerContainer来消费消息,一旦使用以下code snippet进行配置:
<jms:listener-container>
<jms:listener destination="queue.orders" ref="orderService" method="placeOrder"/>
</jms:listener-container>
它将负责根据您的特定要求连接到jms队列基础结构(如果JMS基础结构已关闭,应用程序上下文仍将被加载,但重试线程将尝试每隔几秒恢复一次连接)。
答案 3 :(得分:0)
我认为ActiveMQ有协议(许多协议....)来改变连接行为。尝试在你的网址中使用'failover://'或类似内容,看看它是如何工作的。
答案 4 :(得分:0)
我现在也要解决这个问题。请参阅AMQ-2114。
我不太明白接受的答案,所以我建议赏金。
我使用的是ActiveMQ的C ++版本。但我相信这不应该有太大的不同。
我考虑过在单独的线程中调用connection.start(),并在TransportListener :: transportResumed()中调用并调用connection-&gt; createSession()。但是createSession会挂断。
最重要的是,我没有工作解决方案,我很高兴知道问题的其他解决方案。