在同一消息中从嵌入式代理接收消息的最佳方法是什么?(ActiveMQ)

时间:2012-10-16 09:58:05

标签: java activemq

目前在我的应用程序中运行了一个嵌入式代理,我想在不同的线程中使用同一个应用程序中的队列。它在我使用TCP Transport时有效,但我发现当代理和消费者在同一个应用程序中时我不能使用VM Transport。 (如果我为消费者创建另一个流程,它会起作用)在我的情况下有更好的方法吗?

使用Spring的Broker配置

<amq:broker  id="myBroker" brokerName="myBroker">       
    <amq:transportConnectors>    
        <amq:transportConnector uri="tcp://localhost:7777" />
        <amq:transportConnector uri="vm://myBroker" />
    </amq:transportConnectors>
</amq:broker>

消费者

public class TestConsumer {
    private static String brokerURL = "tcp://localhost:7777";
    private static transient ConnectionFactory factory;
    private transient Connection connection;
    private transient Session session;

    public TestConsumer() throws JMSException {
        factory = new ActiveMQConnectionFactory(brokerURL);
        connection = factory.createConnection();
        connection.start();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    }

    public void close() throws JMSException {
        if (connection != null) {
            connection.close();
        }
    }               
    public Session getSession() {
        return session;
    }

}

监听

public class Listener implements MessageListener {

    public void onMessage(Message message) {
        try {
            //do something here
            System.out.println(message);
        } catch (Exception e) {
            e.printStackTrace();
        }           
    }

}

在主要

TestConsumer consumer = new TestConsumer();
Destination destination = consumer.getSession().createQueue("TESTQUEUE");
MessageConsumer messageConsumer = consumer.getSession().createConsumer(destination);
messageConsumer.setMessageListener(new Listener());

当brokerURL是“tcp:localhost:7777”或“vm:// myBroker”时它可以工作,但Broker和Consumer处于不同的进程中。当两者在同一个应用程序中时,我就无法使用VM Transport。

1 个答案:

答案 0 :(得分:0)

尝试使用VM trnasport。如果我理解正确,您的应用程序本身就会发送和接收消息。在这种情况下,VM传输是最佳选择:它甚至不会退出JVM并使用直接API调用传输消息。

有关详细信息,请参阅此文章。 http://activemq.apache.org/configuring-transports.html