現在、私のアプリケーションで実行されている組み込みブローカーがあり、同じアプリケーション内の異なるスレッドでキューを使用したいと考えています。を使用すると動作しますが、同じアプリケーションでブローカーとコンシューマーを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」であるが、ブローカーとコンシューマーが異なるプロセスにある場合に機能します。2つが同じアプリケーションにある場合、VMトランスポートを使用できません。