2009-12-03 94 views
4

我正在學習如何使用ActiveMQ,現在我們正面臨以下問題。ActiveMQ:如何出列舊信息?

假設我在ActiveMQ上有一個名爲topic.test的主題,它有兩個訂閱者。 在給定的時刻,我只有一個訂閱者在等待消息,而一個製作者發送了一個消息給我上面提到的話題。

好的,連接的用戶會收到消息,但其他用戶在連接後不會收到該消息嗎?那麼,就我而言,這不會發生:我的訂戶只能在連接時接收消息。所有其他未連接時發送的消息都沒有被他們收到。我可能做錯了什麼?

這裏是我寫來測試ActiveMQ的一些源代碼。也許你會發現它有什麼問題。

我consummer代碼:

 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讓我的消費者能得到較舊的郵件?

回答

6

您必須讓您的消費者「永久」。否則,只要退訂,AMQ就會「忘記」他們。爲此,請使用Session.createDurableSubscriber()

+0

非常感謝。完美解決了我的問題 – 2009-12-03 12:18:34

相關問題