代码之家  ›  专栏  ›  技术社区  ›  flybywire

ActiveMQ:在没有代理的情况下启动consumer

  •  3
  • flybywire  · 技术社区  · 15 年前

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

    一个要求是客户机应该启动,即使代理已关闭。在这种情况下,它的行为应该像队列中没有消息一样,一旦代理启动,消息开始相应地行为。

    问题是在我的代码中:

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

    如果经纪人倒下了,那它就陷进去了 connection.start() . 而我想要的是 连接。开始() 以静默方式返回并继续尝试在后台连接并在可以时使用邮件,在不能时保持静默。

    我怎样才能做到这一点。

    5 回复  |  直到 15 年前
        1
  •  1
  •   Finbarr    15 年前

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

    线程1:

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

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

    • 启动客户端
    • 从队列/块读取
    • 处理消息
        2
  •  1
  •   bsnyder    15 年前

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

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

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

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

    布鲁斯

        3
  •  1
  •   Biju Kunjummen    15 年前

    为了子孙后代,我强烈建议使用Spring的DefaultMessageListenerContainer来消费消息,一旦使用以下配置 code snippet :

    <jms:listener-container>
        <jms:listener destination="queue.orders" ref="orderService" method="placeOrder"/>
    </jms:listener-container>
    

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

        4
  •  0
  •   Plínio Pantaleão    15 年前

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

        5
  •  0
  •   dimba    15 年前

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

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

    我用的是C++版本的ActuMeq。但我相信这不会有太大的不同。

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

    总之,我没有有效的解决方案,我很高兴知道其他的解决方案。