2

我正在尝试让 MQ v6 使用消息标志 MQMF_SEGMENTATION_ALLOWED 和放置消息选项 MQPMO_LOGICAL_ORDER 来分段消息,如 IBM 帮助指南中所建议的那样。

ImqMessage message;
message.setFormat(MQFMT_STRING);    
message.setMessageFlags(MQMF_LAST_MSG_IN_GROUP | MQMF_SEGMENTATION_ALLOWED);

/* ... */

ImqPutMessageOptions pmopts;
pmopts.setOptions(MQPMO_LOGICAL_ORDER);

if (!queue.put(message, pmopts))
{
    buflen;
    m_iLastError = queue.reasonCode();
    CString reason;
    reason.Format(_T("%d"), queue.reasonCode());
    _errorMsg = "Reason code: " + reason;
    /* throw exception etc.. */    
}

不管我是否指定了这些标志,当我调用 put() 时,它总是返回 false 并且具有原因代码 (2010) MQRC_DATA_LENGTH_ERROR。

是否有任何与 v6 和分段相关的常见问题(例如它在 Windows 上不可用,任何类似的东西......),或者有什么建议可以尝试?

顺便说一句,为稍微无上下文的代码示例道歉。我会尽力回答人们对我的问题提出的问题。

4

1 回答 1

6

好的,我找到了该特定错误的解决方案:无论消息是否可以分段或队列和队列管理器允许的最大消息大小,都不会将大于通道的最大消息长度的消息放置在队列中。

设置通道的最大消息大小不能仅通过调用来完成ImqChannel::maximumMessageLength()。需要通过命令行进行配置更改:

进入runmqsc YOUR_QUEUE_MANAGER_NAME

在提示符中,检查现有频道的最大消息长度(在 v6 中,默认为 4MB): display channel(CHANNEL_NAME)

你会得到类似的东西

CHANNEL(SYSTEM.DEF.SVRCONN)             CHLTYPE(SVRCONN)
ALTDATE(2013-07-12)                     ALTTIME(09.57.15)
COMPHDR(NONE)                           COMPMSG(NONE)
DESCR( )                                HBINT(300)
KAINT(AUTO)                             MAXMSGL(4194304) <- max length, obvs ;-)
MCAUSER( )                              MONCHL(QMGR)
RCVDATA( )                              RCVEXIT( )
SCYDATA( )                              SCYEXIT( )
SENDDATA( )                             SENDEXIT( )
SSLCAUTH(REQUIRED)                      SSLCIPH( )
SSLPEER( )                              TRPTYPE(TCP)

要增加大小:

alter channel(CHANNEL_NAME) CHLTYPE(SVRCONN) MAXMSGL(104857600)100MB

现在您还需要在代码中设置通道的值,ImqChannel::maximumMessageLength(104857600)否则它将使用默认值 4MB。MAXMSGL 将优先于此调用,因此传递值 > MAXMSGL 将无效。

现在,当您调用 时put(),任何没有分段的消息都会导致错误 2030 (MQRC_MSG_TOO_BIG_FOR_Q) 或 2031 (MQRC_MSG_TOO_BIG_FOR_Q_MGR)。通过分段,现在应该拆分消息并将分段放置在队列中。

希望这对某人有帮助!

于 2013-07-12T13:10:00.163 回答