0

我已将接收到的消息长度设为 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");
    }
  }
}

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

4

2 回答 2

1

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

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

我猜这个问题可能是因为您正在打印 JMSMessage,而发送的消息是 JMSTextMessage。JMSMessage.ToString 可能不会打印整个消息。

于 2012-07-20T05:53:27.433 回答
0

你在哪里将长度设置为1000000?如果您阅读 MQ 文档,您会发现 receiver.receive(10000000); 不设置消息大小。

于 2012-07-19T11:20:35.190 回答