来自队列的MQGET大消息(> 4MB)导致错误2010

时间:2012-11-05 14:53:56

标签: c unix ibm-mq aix

我正在尝试使用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                       */

1 个答案:

答案 0 :(得分: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 File Transfer Edition是当时的解决方案之一。