我正在尝试让 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 上不可用,任何类似的东西......),或者任何可以尝试的建议?
顺便说一句,对于稍微无上下文的代码示例,我们深表歉意。我会尽力回答人们对我的问题提出的问题。
好的,我找到了该特定错误的解决方案:无论消息是否可以分段或队列和队列管理器允许的最大消息大小,大于通道最大消息长度的消息都不会被放置在队列中。
不能仅通过调用来设置通道的最大消息大小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)。通过分段,现在应该拆分消息并将分段放置在队列中。
希望这可以帮助某人!