在ActiveMQ中获取上次插入的消息 - Java

时间:2018-01-29 09:59:24

标签: java activemq

我正在寻找一种浏览/检查特定队列中插入的最后一条消息的最佳方法。 到目前为止,我在想ActiveMQQueueBrowser。请参阅以下代码:

ActiveMQQueueBrowser browser = (ActiveMQQueueBrowser) session.createBrowser(queue);
Enumeration e = browser.getEnumeration();
TextMessage message = null;
while (e.hasMoreElements()) {
    message = (TextMessage) e.nextElement();
}

但是这段代码需要遍历队列中的所有消息,直到它给出最后一条消息。

plz建议是否有其他方法可以这样做。

1 个答案:

答案 0 :(得分:0)

可能是JMX吗? 请参阅下面的示例,您可以在将消息加载到列表中后根据需要对消息进行排序。

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

import org.apache.activemq.broker.jmx.BrokerViewMBean;
import org.apache.activemq.broker.jmx.QueueViewMBean;

public class JMXGetDestinationInfos {

    public static void main(String[] args) throws Exception {
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://host:1099/jmxrmi");
        Map<String, String[]> env = new HashMap<>();
        String[] creds = { "admin", "admin" };
        env.put(JMXConnector.CREDENTIALS, creds);
        JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
        MBeanServerConnection conn = jmxc.getMBeanServerConnection();

        ObjectName activeMq = new ObjectName("org.apache.activemq:type=Broker,brokerName=localhost");

        BrokerViewMBean mbean = MBeanServerInvocationHandler.newProxyInstance(conn, activeMq, BrokerViewMBean.class,
                true);
        for (ObjectName name : mbean.getQueues()) {
            if (("TEST".equals(name.getKeyProperty("destinationName")))) {
                QueueViewMBean queueMbean = MBeanServerInvocationHandler.newProxyInstance(conn, name,
                        QueueViewMBean.class, true);
                List<?> messages = queueMbean.browseMessages();
                System.out.println(messages.get(messages.size() -1));

                System.out.println(queueMbean.browseAsTable());
                System.out.println(queueMbean.browseMessages());
            }
        }
    }
}
如果您的计数器始终可用且已连接,则

另一个选项是使用http://activemq.apache.org/advisory-message.html

  

ActiveMQ.Advisory.MessageDelivered.Queue传递给的消息   代理。

     

ActiveMQ.Advisory.MessageDelivered.Topic消息传递给   代理。