以下のコードを使用して、複数のコンシューマがメッセージを消費するための複数のJMSセッションを作成しています。私の問題は、コードが単一スレッドの方法で実行されていることです。 Queueにメッセージが存在しても、2番目のスレッドは何も受信できず、ポーリングを保持します。第1のスレッドは、第1のバッチの処理を終了し、戻って残りのメッセージを消費する。ここでの使用方法に問題はありますか?マルチスレッドJMSクライアントActiveMQ
static {
try {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://172.16.143.99:61616");
connection = connectionFactory.createConnection();
connection.start();
} catch (JMSException e) {
LOGGER.error("Unable to initialise JMS Queue.", e);
}
}
public JMSClientReader(boolean isQueue, String name) throws QueueException {
init(isQueue,name);
}
@Override
public void init(boolean isQueue, String name) throws QueueException
{
// Create a Connection
try {
// Create a Session
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
if (isQueue) {
destination = new ActiveMQQueue(name);// session.createQueue("queue");
} else {
destination = new ActiveMQTopic(name);// session.createTopic("topic");
}
consumer = session.createConsumer(destination);
} catch (JMSException e) {
LOGGER.error("Unable to initialise JMS Queue.", e);
throw new QueueException(e);
}
}
public String readQueue() throws QueueException {
// connection.setExceptionListener(this);
// Wait for a message
String text = null;
Message message;
try {
message = consumer.receive(1000);
if(message==null)
return "done";
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
text = textMessage.getText();
LOGGER.info("Received: " + text);
} else {
throw new JMSException("Invalid message found");
}
} catch (JMSException e) {
LOGGER.error("Unable to read message from Queue", e);
throw new QueueException(e);
}
LOGGER.info("Message read is " + text);
return text;
}
あなたがメッセージを消費する複数の消費者にしたい場合は、代わりに、キューのトピックを使用しています。 http://activemq.apache.org/how-does-a-queue-compare-to-a-topic.html – Rjiuk
私の場合は、待ち行列に入るリスナーの数を増やそうとしています。現在トピックを使用したくない。 – HariJustForFun