我创建了一个连接到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();
...
}
在queueSession创建中的 true
是因为连接工厂是事务处理的。
如果我创建一个没有事务处理的queueSession(通过放置false
),结果就是queueReceiver似乎忽略了通过receive()
方法的doStuff
方法(使用receive(timeout)
的相同行为) ,它不会在经过之前等待。)
我还必须在我的连接工厂(WebLogic连接工厂的配置中的客户端选项卡)上启用Prefetch Mode for Synchronous Consumer。
我的问题是接收方没有读取发送到队列的任何消息。
我可以在WebLogic控制台上看到我的消息,我甚至可以看到我的queueReceiver正在侦听队列,但是queueReceiver似乎忽略了它们。
替代方法我尝试过:
send()
之后和close()
谢谢。
答案 0 :(得分:5)
您忘记在start
上调用QueueConnection
方法:
queueConnection = qconFactory.createQueueConnection();
queueConnection.start();
queueSession = queueConnection.createQueueSession(true, -1);
Java EE Tutorial中的The JMS API Programming Model有用地说:
在您的应用程序消费消息之前,您必须调用连接的
start
方法。
JMS Message Consumers部分更清晰:
请记住始终调用
start
方法;忘记启动连接是最常见的JMS编程错误之一。
答案 1 :(得分:0)
connection = (MQQueueConnection) mqQueueConnectionFactory.createQueueConnection();
MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
MQQueue queue = (MQQueue) session.createQueue("queue:///" + requestQueueName);
MQQueue responseQueue = (MQQueue) session.createQueue("queue:///" + responeQueueName);
MQQueueSender sender = (MQQueueSender) session.createSender(queue);
MQQueueReceiver receiver = (MQQueueReceiver) session.createReceiver(responseQueue);
isConnected = true;
System.out.println("-------- preparing request to send: ");
String messageString = requestString;
JMSTextMessage message = (JMSTextMessage) session.createTextMessage(messageString);
message.setJMSType("XML/MQ");
// message.setJMSReplyTo(responseQueue);
connection.start();
sender.send(message);
JMSMessage receivedMessage = (JMSMessage) receiver.receive(TIMEOUT);
System.out.println("-------- recieved JMSMessage is: \n"+receivedMessage);
sender.close();
receiver.close();
session.close();
connection.close();
System.out.println("-------- getting response: ");
responseXMLString = receivedMessage != null ? ((JMSTextMessage) receivedMessage).getText() : "No response recieved. Timed Out";
我得到No response received. Timed Out
。没有显示响应消息。