我创建了一个附加到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/