次のコードスニペット(スタンドアロンJavaアプリケーション)は、同じクライアントがメッセージリスナーを使用して実装されている場合(Glassfish 3.1を使用)、キューでメッセージを検出することはありません。
ctx = new InitialContext();
connectionFactory = (ConnectionFactory) ctx.lookup("foo.Factory");
partsQueue = (Queue) ctx.lookup("foo.PartsQueue");
conn = connectionFactory.createConnection();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
consumer = session.createConsumer(partsQueue);
conn.start();
Message msg = null;
int cnt = -1;
do {
cnt++;
msg = consumer.receiveNoWait();
} while (msg != null);
System.out.println("cnt: " + cnt);
コンシューマーの作成後に次のコードを使用すると、リスナーはメッセージを見つけて正常に消費します。
listener = new AssemblerListener(this);
consumer.setMessageListener(listener);
System.out.println("waiting for msgs...");
conn.start();
前述のように、スタンドアロンのJavaクライアントでは、MDBで同期的に何かを実行しようとはしていません。何か案は?ここで同期読み取りが機能しない理由のヒントは見つかりませんでした。この場合、異なるフィルターを使用して2つのメッセージを読み取る必要があるため、メッセージリスナーを使用することは最善のオプションではありません。