代码之家  ›  专栏  ›  技术社区  ›  Kico Lobo

activemq:如何将旧消息出列?

  •  4
  • Kico Lobo  · 技术社区  · 16 年前

    我正在学习如何使用ActiveMQ,现在我们面临以下问题。

    假设我在ActiveMQ上有一个名为topic.test的主题,它有两个订户。 在给定的时间内,我只有一个订户在等待消息,一个生产者为我上面提到的主题发送消息。

    好的,已连接的订阅服务器会收到消息,但其他订阅服务器在连接后不应该收到该消息吗?好吧,在我的情况下,这不会发生:我的订户只在连接时接收消息。在没有连接的情况下发送的所有其他消息都不会被接收。我可能做错什么了?

    下面是我为测试ActiveMQ编写的一些源代码。也许你会发现它出了什么问题。

    我的用户代码:

            ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
            Connection connection = connectionFactory.createConnection();
            connection.setClientID("leitorTeste");
            conexao.start();
            Session sessao = conexao.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Topic fonte = sessao.createTopic("topic.test");
            MessageConsumer consumer = sessao.createConsumer(fonte);
            javax.jms.Message presente = null;
            while ((presente = consumer.receive()) != null) {
                System.out.println(((TextMessage) presente).getText());
            }
            consumer.setMessageListener(new LeitorMensagens());
            conexao.close();
    

    这是我的生产商代码:

    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
            Connection connection = connectionFactory.createConnection();
            Session sessao = conexao.createSession(true, Session.AUTO_ACKNOWLEDGE);
            connection.start();
            Destination destino = sessao.createTopic("topic.test");
            MessageProducer produtorMensagem = sessao.createProducer(destino);
            produtorMensagem.setDeliveryMode(DeliveryMode.PERSISTENT);
            TextMessage message = sessao.createTextMessage("Hi!");
            produtorMensagem.send(message);
            sessao.commit();
            connection.close();
    

    我是否应该将其他配置添加到ActiveMQ中,以便我的用户能够获取旧消息?

    2 回复  |  直到 16 年前
        1
  •  6
  •   Aaron Digulla    16 年前

    你必须使你的消费者“永久”。否则,一旦AMQ退订,他们就会“忘记”他们。为此,请使用 Session.createDurableSubscriber()

        2
  •  1
  •   Rob Davies    16 年前

    有个叫A的东西 retroactive consumer 还可以在代理上设置策略。这是为主题订户提供的-这些订户不耐用,但可能希望接收他们可能错过的“最近”消息-另请参阅 Subscription Recovery Policy