ActiveMQ:没有经纪人的初始消费者

时间:2010-11-29 10:59:12

标签: java asynchronous jms messaging activemq

我正在编写一个从队列中消耗的JMS客户端。如果重要的话,我的经纪人是activemq。

一个要求是即使代理已经关闭,客户端也应该启动。在这种情况下,它应该表现得好像队列中没有消息,并且一旦代理启动并且消息开始相应的行为。

问题在于我的代码:

connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection();
connection.start()

如果经纪人关闭,那么它会陷入connection.start()。虽然我想要的是connection.start()以静默方式返回并继续尝试在后台连接并消费消息,而不能消息。

我怎样才能做到这一点。

5 个答案:

答案 0 :(得分:1)

使用单独的线程从队列中消耗并开始连接。您将需要使用并发队列实现。

主题1:

  • 实例化队列
  • 启动线程2
  • 尝试连接/阻止
  • 将消息添加到队列

线程2(或某种类型的池):

  • 启动客户端
  • 从队列/块中读取
  • 处理消息

答案 1 :(得分:1)

有两种方法可以解决此类情况,其中一种方法在AMQ-2114中有描述:

  1. 使用AMQ-2114中建议的代理URI。通过使用AMQ-2114中建议的代理URI,可以创建具有到远程代理的网络连接的嵌入式代理。但是,正如所指出的那样,该代理URI不使用故障转移连接器。

  2. 通过使用手动配置的嵌入式代理来使用代理网络。我过去曾使用过这种方法,在Java应用程序中嵌入了ActiveMQ代理实例,并且它配置了与远程代理的网络连接。这将允许您的客户端连接到嵌入式代理而不会挂起,并将消息发送到嵌入式代理。消息将从嵌入式代理流向远程代理,但仅当消费者需要远程代理上的消息时(即,消费者连接到远程代理并请求消息)。与嵌入式代理的连接可以使用故障转移传输,与远程代理的网络连接也可以使用故障转移传输。

  3. 我为此解决方案提供的示例是一个用例,是销售人员笔记本电脑上的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会挂断。

最重要的是,我没有工作解决方案,我很高兴知道问题的其他解决方案。