以下代码片段(独立的 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 中同步做某事。有任何想法吗?没有找到任何提示为什么同步读取在这里不起作用。在这种情况下,使用消息侦听器不是最佳选择,因为有时我必须使用不同的过滤器读取两条消息。