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

问题描述 投票:0回答:2

我正在尝试使用 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                       */
c unix ibm-mq aix
2个回答
3
投票

我明白了!答案是使用 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 文件传输版就是解决方案之一。


0
投票

对于nodejs,请使用以下代码。

const mq = require('ibmmq')
const MQC = mq.MQC

// Create default MQCNO structure
const cno = new mq.MQCNO()

// Add authentication via the MQCSP structure
var csp = new mq.MQCSP()
csp.UserId = process.env.MQ_USER
csp.Password = process.env.MQ_PASSWORD

// This line allows use of the userid/password
cno.SecurityParms = csp

// And use the MQCD to programmatically connect as a client
// First force the client mode
cno.Options |= MQC.MQCNO_CLIENT_BINDING

// And then fill in relevant fields for the MQCD
var cd = new mq.MQCD()
cd.ConnectionName = `${process.env.MQ_HOST}(${process.env.MQ_PORT})`
cd.ChannelName = `${process.env.MQ_CHANNEL}`

// Set the maximum message length to 100 MB (104857600 bytes)
cd.MaxMsgLength = 104857600; // 100 MB 
© www.soinside.com 2019 - 2024. All rights reserved.