【问题标题】:QueueReceiver receive() does not receive messagesQueueReceiver receive() 不接收消息
【发布时间】:2014-03-31 05:03:46
【问题描述】:

我创建了一个连接到 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 创建中这是因为连接工厂已处理。 如果我创建一个无事务队列会话(通过放置false),结果是queueReceiver 似乎忽略了通过doStuff 方法的receive() 方法(使用receive(timeout) 的行为相同,它在通过之前不会等待)。

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

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

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

我尝试过的替代方法:

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

谢谢。

【问题讨论】:

    标签: java jms weblogic


    【解决方案1】:

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

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

    正如 Java EE 教程中的 The JMS API Programming Model 所说:

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

    JMS Message Consumers 部分更清楚:

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

    【讨论】:

      【解决方案2】:
              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。没有显示响应消息。

      【讨论】:

      • 听起来像是一个问题。请创建一个新问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多