ActiveMQ:没有经纪人的新手消费者

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

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

问题是在我的代码中:

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

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

我怎样才能做到这一点。

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

线程1:

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

线程2(或某种池):

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

有两种方法可以解决这种类型的场景,其中一种方法在AMQ-2114中描述:

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

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

我为此解决方案提供的示例是用例是销售人员笔记本电脑上的Java应用程序。 即使销售人员没有连接到他们的办公室网络,这样的应用程序也需要继续工作。 这里的解决方案是在Java应用程序中嵌入代理,以便在发送消息时应用程序不会挂起,即使它没有连接到办公室网络。 当应用程序再次连接到办公室网络时,它将自动连接到另一个代理并且消息将流动。

布鲁斯

对于后代,我强烈建议使用Spring的DefaultMessageListenerContainer来消费消息,一旦使用以下代码片段进行配置:

    

它将负责根据您的特定要求连接到jms队列基础结构(如果JMS基础结构已关闭,应用程序上下文仍将被加载,但重试线程将尝试每隔几秒恢复一次连接)。

我认为ActiveMQ有协议(许多协议….)来改变连接行为。 尝试在您的url中使用“failover://”或类似内容,看看它是如何工作的。

我现在也要解决这个问题。 见AMQ-2114 。

我不太明白接受的答案,所以我建议赏金。

我正在使用C ++版本的ActiveMQ。 但我相信这不应该有太大的不同。

我想过在单独的线程中调用connection.start()并在TransportListener :: transportResumed()中调用和调用connection-> createSession()。 但是createSession挂断了。

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