2012-07-19 149 views
0

我已经给接收到的报文长度1000000但还是消息被截断完成代码如下Recived JMS消息被截断

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"); 
    } 
    } 
} 

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

回答

1

由于Germann指出你通过接收方法的参数不是消息大小,它实际上是以毫秒为单位的等待时间。这意味着电话必须等待电文到达多久。例如,如果您已将等待时间设置为1000,则接收呼叫将等待1秒钟以便消息到达。如果消息在1秒之前到达,则该呼叫将立即返回并将消息发送给应用程序。如果一条消息在一秒钟后还没有到达,那么该呼叫将以超时返回,并且不会向应用程序发送消息。在MQ中,您将看到2033个原因码。

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

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

+0

我同意你们两个。 还有另一个应用程序正在使用我发送的消息,并将其响应放入我的接收队列中,我收到并打印的消息不是完整消息,这就是为什么我说它被截断,是否有可能的方法来打印完整消息? – 2012-07-20 09:25:44

+0

我会检查另一端是否肯定向您发送您期望的消息。你也可以通过在本地机器上设置ActiveMq(或其他)来测试你的代码,并将你的应用指向本地队列。然后你可以检查内容匹配。 – DaveRlz 2012-07-20 11:06:56

+0

我得到了解决方案 System.out.println(“\\ nReceived message:\\ n”+ receivedMessage.getText());只是叫.getText()我得到了完整的消息。 – 2012-07-20 11:34:07

0

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

+0

我不知道,我只是试过!你知道它为什么截断吗? – 2012-07-19 11:29:31

+0

什么被截断。任何例子? 您是否尝试发送然后收到您自己的消息? 您是否注意到您创建并发送了JMSTextMessage并尝试接收JMSMessage。他们行为的细微差别可能解释什么和为什么被截断。 – 2012-07-19 13:23:27