【问题标题】:MQGET big message ( > 4MB) from the queue results in error 2010队列中的 MQGET 大消息 (> 4MB) 导致错误 2010
【发布时间】:2012-10-25 10:24:49
【问题描述】:

我正在尝试使用 ANSI-C 和 MQGET 函数从队列中接收消息。问题是我总是收到错误 2010 (MQRC_DATA_LENGTH_ERROR)。

我发现此错误与 MQGET 调用的参数 7 (DataLength) 有关。我队列上的消息有 7157460 字节。我用于 MQGET 的通道将“最大消息长度”设置为 104857600(以及保存消息的队列)。

我什至使用了这个例子中的 MQGET: http://www.capitalware.biz/dl/code/c/msg2file.zip

我仍然得到错误 2010。我做错了什么?我应该以某种方式增加 MQSERVER 环境变量中消息的最大大小吗?

MQGET 调用:

/* ... */
MQLONG   messlen;            /* message length received       */

MQGET(Hcon,                  /* connection handle                 */
        Hobj,                /* object handle                     */
        &md,                 /* message descriptor                */
        &gmo,                /* get message options               */
        buflen,              /* pBuffer length                    */
        pBuffer,             /* pointer to message buffer         */
        &messlen,            /* message length                    */
        &CompCode,           /* completion code                   */
        &Reason);            /* reason code                       */

【问题讨论】:

  • 您使用的是什么版本的 MQ? 2010 年的文档说“DataLength 参数无效。参数指针无效,或者它指向只读存储。(并不总是可以检测到无效的参数指针;如果未检测到,则结果不可预测如果 BufferLength 参数超过为客户端通道协商的最大消息大小,则此原因也可以在 MQGET、MQPUT 或 MQPUT1 调用上返回给 MQ MQI 客户端程序。”因此,请检查是否属于这种情况。
  • 我不知道您的配置,但我在 z/OS 上,其中 >4MB 是单独购买的选项。所以在这里它永远不会起作用!这也是你的问题吗?
  • 我在 Unix 上使用 Websphere MQ 7.5。 MQGET 程序位于另一个 unix (AIX) 上。我已阅读有关此问题的文档,但这些对我无效。尝试从我在帖子中提供的 msg2file 中读取源代码。

标签: c unix ibm-mq aix


【解决方案1】:

我明白了!答案是使用 MQCONNX 调用连接到队列管理器。

例子:

#include <cmqxc.h>
/* ... */
MQCNO   mqcno = {MQCNO_DEFAULT} ; /* Connection options */
MQCD    mqcd  = {MQCD_CLIENT_CONN_DEFAULT};  /* Channel Defs */

/* ... */
mqcd.MaxMsgLength = 104857600L; /* 100 MB */

MQCONNX(mQueueManager.Name,
     &mqcno,
     &mQueueManager.ConnectionHandle,
     &mQueueManager.CompletionCode,
     &mQueueManager.ReasonCode);

它就像一个魅力!

但请记住 - 如果您发现自己需要增加最大邮件大小 - 请三思。设计可能有问题。换句话说 - MQ 不应该用于传输大消息。 MQ 文件传输版是当时的解决方案之一。

【讨论】:

  • 很高兴你成功了!我对你的帖子做了一个小的更正。从 v7.5 开始,FTE 包装从独立产品更改为与 WMQ 集成交付并作为权利出售。仍然有单独的部件号和许可费用,而不是单独的下载和安装,您只需打开该功能。
  • 这就是我的意思。我想我把这句话过分简化了。还是谢谢!
猜你喜欢
  • 2015-12-08
  • 1970-01-01
  • 2011-05-13
  • 2013-07-18
  • 1970-01-01
  • 2016-05-29
  • 2013-12-06
  • 2015-01-07
  • 1970-01-01
相关资源
最近更新 更多