2016-09-22 13 views
0

activemqでアプリケーションを構築しています。ここで、私の配信モードはNON_PERSISTENT(iamはPERSISTENT配信モードを扱っていません。私のデザインではないDLQに格納されます。)、producer.setTimeToLive(2000)を使用してメッセージの生存時間を設定しました。メッセージが2秒で期限切れになると機能が伝えます。ActiveMQ.Advisory.Expired.Queueで非永続的なactivemq期限切れのメッセージを繰り返します。

私は期限切れのメッセージがActiveMQの管理コンソールすなわちhttp://localhost:8161/admin/topics.jspの話題区間でActiveMQ.Advisory.Expired.Queueにエンキューされていることがわかります。

私の質問は、私はので、私は素晴らしいことだ期限切れのmessage.Anyのコード例のメッセージIDにアクセスできることをActiveMQ.Advisory.Expired.Queueを反復行う方法です。

答えて

2

宛先へのサブスクリプションActiveMQ.Advisory.Expired.Queueは、どのトピックと同様で、ActiveMQMessageを返します。 ActiveMQMessageのgetDataStructureメソッドを使用して取得できるDataStructureオブジェクト(ConsumerInfo、ProducerInfo、ConnectionInfo ...)があります。

ドキュメント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 ** useQueueForTopicMessagesを使用して**回答コードは、このユースケースのために不可能であること\t \t \t \t \t \t ' –

関連する問題