2016-09-22 62 views
0

Iam在activemq上構建應用程序,其中iam從生產者發送消息,其傳遞模式爲NON_PERSISTENT(iam不處理PERSISTENT傳輸模式,我知道它將被存儲在DLQ中 - 這不是我的設計),並且使用producer.setTimeToLive(2000)爲消息設置了生存時間。由於該功能表示消息將在2秒內過期。迭代ActiveMQ.Advisory.Expired.Queue中的非持久activemq過期消息

我看到過期的消息在ActiveMQ.Advisory.Expired.Queue在ActiveMQ的管理控制檯即http://localhost:8161/admin/topics.jsp的主題部分排隊。

我的問題是我如何遍歷ActiveMQ.Advisory.Expired.Queue,這樣我可以訪問郵件ID過期message.Any代碼示例的將是巨大的。

回答

2

訂閱目標ActiveMQ.Advisory.Expired.Queue就像任何主題,它返回一個ActiveMQMessage。 可以通過ActiveMQMessage的getDataStructure方法檢索DataStructure對象(ConsumerInfo,ProducerInfo,ConnectionInfo ...)。

DOC http://activemq.apache.org/advisory-message.html

例如:

Destination advisoryDestination = AdvisorySupport.getExpiredQueueMessageAdvisoryTopic(destination) 
MessageConsumer consumer = session.createConsumer(advisoryDestination); 
consumer.setMessageListener(this); 

public void onMessage(Message msg){ 
    String messageId = msg.getJMSMessageID(); 
    String orignalMessageId = msg.getStringProperty(org.apache.activemq.advisory.AdvisorySupport.MSG_PROPERTY_MESSAGE_ID); 
    if (msg instanceof ActiveMQMessage){ 
     try { 
      ActiveMQMessage aMsg = (ActiveMQMessage)msg; 
      ProducerInfo prod = (ProducerInfo) aMsg.getDataStructure(); 
     } catch (JMSException e) { 
      log.error("Failed to process message: " + msg); 
     } 
    } 
} 
+0

精湛理解的概念和工程就像一個魅力!!!! –

+0

@Hassen Bennour通過使用上面的代碼,我可以接收消息偵聽器啓動後過期的消息。我無法收到駐留在** DLQ **中的以前過期的消息。我如何迭代並獲取以前過期的消息?我擔心我也需要這些消息。 –

+0

您可以嘗試將此策略添加到您的主題,以使用隊列而不是主題作爲DLQ,就像這樣,如果沒有消費者在線,消息不會丟失,關鍵是** useQueueForTopicMessages ** ' \t \t \t \t 」> \t \t \t \t \t \t \t \t \t \t \t \t \t \t ' –