在ActiveMQ.Advisory.Expired.Queue

时间:2016-09-22 04:47:40

标签: java jms activemq jms-topic activemq-artemis

我在activemq上构建一个应用程序,我从生产者发送消息,我的交付模式是NON_PERSISTENT( iam没有处理PERSISTENT交付模式,我知道它将存储在DLQ中 - 这不是我的设计)并使用producer.setTimeToLive(2000)为消息设置了一个生存时间。由于功能说消息将在2秒后过期。

我看到过期的消息在activeMQ管理控制台的主题部分的 ActiveMQ.Advisory.Expired.Queue 中排队,即 http://localhost:8161/admin/topics.jsp 。< / p>

我的问题是如何迭代 ActiveMQ.Advisory.Expired.Queue ,以便我可以访问过期消息的 MessageID 。任何代码示例都是大。

1 个答案:

答案 0 :(得分: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);
        }
    }
}