Полученное сообщение JMS усекается

Я указал длину полученного сообщения как 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");
    }
  }
}

Если длина сообщения превышает какой-то предел, я не знаю, сколько, но оно усекается, любой способ увеличения или обходной путь для отображения полного сообщения.


person tharani dharan    schedule 19.07.2012    source источник


Ответы (2)


Как указал Германн, параметр, который вы передаете методу приема, - это не размер сообщения, а время ожидания в миллисекундах. Это означает, как долго вызов должен ждать получения сообщения. Например, если вы установили время ожидания равным 1000, то входящий вызов будет ждать прибытия сообщения в течение 1 секунды. Если сообщение приходит раньше 1 секунды, вызов немедленно вернется и передаст сообщение приложению. Если сообщение не приходит даже через секунду, вызов вернется с тайм-аутом, и приложение не получит никакого сообщения. В терминах MQ вы увидите код причины 2033.

Как вы определяете, что сообщение усечено? Вы получаете исключение MQRC_TRUNCATED_MESSAGE_FAILED? Это исключение будет сгенерировано, если предоставленного приложением буфера недостаточно для заполнения входящего сообщения. Ожидается, что MQ JMS не вызовет исключение MQRC_TRUNCATED_MESSAGE_FAILED, поскольку он внутренне обрабатывает требуемый размер буфера и возвращает сообщение приложению.

Я предполагаю, что проблема может быть в том, что вы печатаете JMSMessage, тогда как отправленное сообщение - это JMSTextMessage. JMSMessage.ToString может не печатать все сообщение.

person Shashi    schedule 20.07.2012
comment
Я согласен с вами обоими. Есть другое приложение, которое использует мое отправленное сообщение, и его ответ помещается в мою очередь получателя, сообщение, которое я получил и распечатал, не является полным сообщением. Вот почему я сказал, что оно усечено. Есть ли способ распечатать все сообщение? - person tharani dharan; 20.07.2012
comment
Я бы проверил, что другой конец определенно отправляет вам сообщение, которое вы ожидаете. И вы также можете протестировать свой код, настроив ActiveMq (или что-то еще) на вашем локальном компьютере и направив свое приложение в локальные очереди. Затем вы можете проверить соответствие содержимого. - person Dave Richardson; 20.07.2012
comment
Получил решение System.out.println (\\ nReceived message: \\ n + receiveMessage.getText ()); только что вызвал .getText (), я получил полное сообщение. - person tharani dharan; 20.07.2012

Где выставить длину 1000000? Если вы прочитаете документацию MQ, вы найдете файл Receiver.receive (10000000); НЕ устанавливает размер сообщения.

person Germann Arlington    schedule 19.07.2012
comment
Не знаю. Я просто пробовала !! вы знаете, почему он обрезается? - person tharani dharan; 19.07.2012
comment
Что усекается. Есть примеры? Вы пытаетесь отправить, а затем получить собственное сообщение? Вы заметили, что вы создаете и отправляете JMSTextMessage и пытаетесь получить JMSMessage. Небольшая разница в их поведении может объяснить, что и почему обрезается. - person Germann Arlington; 19.07.2012