【问题标题】:MQMessage deos not send whole messageMQMessage deos 不发送整个消息
【发布时间】:2013-03-10 08:18:15
【问题描述】:

我对 MQMessage 代理相当陌生。在我的项目中,我想发送一条 xml 消息。一切都很好,但是当消息大于 500 字节时,我的代码会将损坏的消息发送到队列。我正在做的是

//queueManager has been initialized in the class constructor and connected to a channel.
        public MQResponse WriteMsg(string QueueName, string strInputMsg)
        {
            MQResponse response = new MQResponse();
            try
            {
                queue = queueManager.AccessQueue(QueueName,
                    MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING );

                queueMessage = new MQMessage();
                queueMessage.DataOffset = 0;
                //queueMessage.MessageLength = 2000000;
                queueMessage.ResizeBuffer(6 * strInputMsg.Length);
                queueMessage.WriteString(strInputMsg);
                queueMessage.Format = MQC.MQFMT_STRING;

                queuePutMessageOptions = new MQPutMessageOptions();
                queue.Put(queueMessage, queuePutMessageOptions);
                response.Message = "Message sent to the queue successfully";
                response.Status=MQResponseStatus.WriteSuccessful;
            }
            catch (MQException MQexp)
            {
                response.Message = "Exception: " + MQexp.Message;
                response.Status=MQResponseStatus.WriteFail;
                response.CatchedException=MQexp;
            }
            catch (Exception exp)
            {
                response.Message = "Exception: " + exp.Message;
                response.Status=MQResponseStatus.WriteFail;
                response.CatchedException=exp;
            }
            return response;
        }

我猜 queueMessage 应该被正确初始化,以便我们能够发送整个消息。

【问题讨论】:

  • 我想在Shashi 的回复中添加两点。 1) 如果你得到一个 JMS 异常,打印链接的异常。 JMS 异常是一种多级数据结构,其中链接的异常具有特定于供应商的错误。如果应用程序不打印它,那么它可能很难调试。 2)您提到使用客户端频道,但我没有看到任何COMMIT 调用。在网络上使用异步消息传递时,总是使用事务处理会话和 COMMIT 方法。请参阅 JMS 1.1 规范 4.4.13 Duplicate Production of Messages 或我的其他 SO 答案以了解原因。

标签: ibm-mq mq


【解决方案1】:

首先,您如何确定消息已损坏?您是否尝试接收发送的消息并与原始消息进行比较,或者您使用 MQExplorer 或其他方式查看了该消息。 MQExplorer 默认显示消息的前 1000 个字节。要查看更多内容,您需要更改Window/Preferences/Messages 面板中的Max data bytes displayed 设置。

WebSphere MQ 可以处理大小高达 100 MB 的消息。

关于您上面的代码 sn-p:几行代码就足以构建和发送消息。

            queueMessage = new MQMessage();
            queueMessage.Format = MQC.MQFMT_STRING; 
            queueMessage.WriteString(strInputMsg);
            queuePutMessageOptions = new MQPutMessageOptions();
            queue.Put(queueMessage, queuePutMessageOptions);

【讨论】:

  • 我使用 MQ Explorer 查看了队列,我意识到我的消息已损坏。每次我发送一条大消息时,我都会在队列中收到一条损坏的消息。我知道每条消息可以达到 100 MB,但我不知道。
  • 正如我所说,MQExplorer 将只显示前 1000 个字节。您是否更改了消息首选项并尝试?
猜你喜欢
  • 2012-03-25
  • 2016-06-03
  • 2020-11-04
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
相关资源
最近更新 更多