收到的JMS消息被截断

时间:2012-07-19 10:57:18

标签: java jms ibm-mq mq

我已将收到的消息长度设为1000000但仍然消息被截断,已完成的代码低于

import java.io.FileInputStream;

import javax.jms.JMSException;
import javax.jms.Session;


import com.ibm.jms.JMSMessage;
import com.ibm.jms.JMSTextMessage;
import com.ibm.mq.jms.JMSC;
import com.ibm.mq.jms.MQQueue;
import com.ibm.mq.jms.MQQueueConnection;
import com.ibm.mq.jms.MQQueueConnectionFactory;
import com.ibm.mq.jms.MQQueueReceiver;
import com.ibm.mq.jms.MQQueueSender;
import com.ibm.mq.jms.MQQueueSession;


public class SimplePTP {

  public static void main(String[] args) {
    try {
      MQQueueConnectionFactory cf = new MQQueueConnectionFactory();
String request= null;
      // Config
      cf.setHostName("CTMQ9000");
      cf.setPort(1414);
      cf.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
      cf.setQueueManager("CTMQTST01");
      cf.setChannel("SYSTEM.ADMIN.SVRCONN");

      MQQueueConnection connection = (MQQueueConnection) cf.createQueueConnection();
      MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
      MQQueue queue = (MQQueue) session.createQueue("CONTPLAT.CPS.DELIVERYPREP.REQUEST.TEST");
      MQQueueSender sender =  (MQQueueSender) session.createSender(queue);
      MQQueue queue1 = (MQQueue) session.createQueue("CONTPLAT.CPS.DELIVERYPREP.RESPONSE.TEST");
      MQQueueReceiver receiver = (MQQueueReceiver) session.createReceiver(queue1);      

      String request ="sdfHelp Me Name name for Photo Studio!I'm opening a portrait studio in a my town and am stuck on what to name it. I will be photographing (Portrait, wedding Photography)) children and families both at the studio and on location.sdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffsdf"
      long uniqueNumber = System.currentTimeMillis() % 1000;
      JMSTextMessage message = (JMSTextMessage) session.createTextMessage(request);     

      // Start the connection
      connection.start();

      sender.send(message);
      System.out.println("Sent message:\\n" + message +"lol");
Thread.sleep(2000);
      JMSMessage receivedMessage = (JMSMessage) receiver.receive(10000000);
      System.out.println("\\nReceived message:\\n" + receivedMessage);

      sender.close();
      receiver.close();
      session.close();
      connection.close();

      System.out.println("\\nSUCCESS\\n");
    }
    catch (JMSException jmsex) {
      System.out.println(jmsex);
      System.out.println("\\nFAILURE\\n");
    }
    catch (Exception ex) {
      System.out.println(ex);
      System.out.println("\\nFAILURE\\n");
    }
  }
}

如果邮件的长度超过某个限制,我不知道多少,但它被截断,任何增加或解决方法以显示完整的消息。

2 个答案:

答案 0 :(得分:1)

正如Germann所指出的,传递给receive方法的参数不是消息大小,实际上是以毫秒为单位的等待时间。表示呼叫必须等待消息到达的时间。例如,如果您将等待时间设置为1000,则接收呼叫将等待1秒钟以便消息到达。如果消息在1秒之前到达,则呼叫将立即返回并将消息提供给应用程序。如果消息即使在一秒钟后仍未到达,则呼叫将以超时返回,并且不向应用程序发送消息。在MQ术语中,您将看到2033原因代码。

您如何确定邮件被截断?您是否收到MQRC_TRUNCATED_MESSAGE_FAILED异常?如果应用程序提供的缓冲区不足以填充传入消息,则抛出此异常。 MQ JMS不会抛出MQRC_TRUNCATED_MESSAGE_FAILED异常,因为它在内部处理所需的缓冲区大小并将消息返回给应用程序。

我猜测问题可能是因为您正在打印JMSMessage而发送的消息是JMSTextMessage。 JMSMessage.ToString可能无法打印整个消息。

答案 1 :(得分:0)

您将长度设置为1000000? 如果您阅读MQ文档,您会发现receiver.receive(10000000);不设置邮件大小。