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