activemq では、何か間違っている可能性があります。メッセージを消費しながら、コンシューマーを作成し、messageListener (consumer.setMessageListener(MessageListener)) を設定しています。これにより、activeMQ がデッドロックします。
これが私がやっていることのコードサンプルです:
class DriverClass extends MessageListener
{
Destination destination = session.createTopic("Some.Topic");
MessageListener msgSub = new MyClass(destination);
Session session = passedInSession;
MessageConsumer consumer;
try
{
consumer = session.createConsumer(destination);
msgSub.setConsumer( consumer );
if(msgSub.getMessageListener() != null)
{
consumer.setMessageListener( msgSub );
}
}
catch (Exception ex)
{
LOGGER.error( "Error subscribing to "+msgSub.getTopic()
+" Error message: ", ex );
}
}
class MyClass extends MessageListener
{
Destination dest;
public MyClass(Destination destToUse)
{
dest = destToUse;
}
@Override
public void onMessage( final Message message )
{
//note here we are using the same topic
MessageListener msgSub = new MyMessageListener("Some.Topic");
MessageConsumer consumer;
try
{
//note here we are using the same dest as above
consumer = session.createConsumer(dest);
msgSub.setConsumer( consumer );
if(msgSub.getMessageListener() != null)
{
//this is where it deadlocks subscribing while consuming a message
//on the same topic/destination
consumer.setMessageListener( msgSub );
}
}
catch (Exception ex)
{
LOGGER.error( "Error subscribing to "+msgSub.getTopic()
+" Error message: ", ex );
}
}
}
基本的に、ActiveMQ スレッド内のコンシューマ内でサブスクライブしています。この問題に関する唯一の参照は、https ://issues.apache.org/jira/browse/AMQ-336 にありますが、回避策が何であるかはわかりません。今のところ、サブスクリプション呼び出しをワーカー スレッドに置き、制御を ActiveMQ に戻すだけですが、より良い解決策があるようです。同じトピック/宛先のメッセージを処理しているときに、トピック/宛先にサブスクライブしているという問題ですか?