QueueReceiver receive()不接收消息

时间:2014-02-27 16:12:58

标签: java jms weblogic

我创建了一个连接到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似乎忽略了它们。

替代方法我尝试过:

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

谢谢。

2 个答案:

答案 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。没有显示响应消息。