我创建了一个附加到WebLogic队列的同步QueueReceiver。

doStuff() {
  ctx = new InitialContext();
  qconFactory = (QueueConnectionFactory) ctx.lookup(CONNECTION_FACTORY);
  queue = (Queue) ctx.lookup(outputFromOrcSyncQueue);
  queueConnection = qconFactory.createQueueConnection();
  queueSession = queueConnection.createQueueSession(true, -1);
  queueReceiver = queueSession.createReceiver(queue);
  Message message = queueReceiver.receive();
  ...
}


true在queueSession创建中是因为连接工厂已处理。
如果我创建一个没有事务处理的queueSession(通过放置false),结果是queueReceiver似乎忽略了通过receive()方法进行的doStuff方法(与使用receive(timeout)的行为相同,它不会等待通过)。

我还必须在连接工厂(WebLogic连接工厂配置中的“客户端”选项卡)上启用Prefetch Mode for Synchronous Consumer

我的问题是接收者无法读取发送到队列的任何消息。

我可以在WebLogic控制台上看到消息,甚至可以看到queueReceiver在队列上侦听,但是queueReceiver似乎忽略了它们。

我尝试过的替代方法:


在queueSession创建中更改ACK类型(双方,生产者和使用者)
send()之后和close()之前在生产者上提交会话


谢谢。

最佳答案

您忘记了在start上调用QueueConnection方法:

queueConnection = qconFactory.createQueueConnection();
queueConnection.start();
queueSession = queueConnection.createQueueSession(true, -1);


正如Java EE教程中的The JMS API Programming Model有益地指出:


  在您的应用程序可以使用消息之前,您必须调用连接的start方法。


JMS Message Consumers部分使它更清晰:


  记住总是要调用start方法。忘记启动连接是最常见的JMS编程错误之一。

关于java - QueueReceiver receive()不接收消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22074082/

10-10 13:37