我正在尝试使用消息标志MQMF_SEGMENTATION_ALLOWED和IBM消息指南中建议的put消息选项MQPMO_LOGICAL_ORDER来获取MQ v6来对消息进行分段。
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上不可用,有什么明显的......),或者有什么建议要尝试?
为略微无上下文的代码示例btw道歉。我会尽力回答人们对我的问题的疑问。
答案 0 :(得分:3)
好的,我找到了该特定错误的解决方案:无论邮件是否可以分段或最大,都不会将大于频道的最大邮件长度的邮件放在队列中队列和队列管理器允许的消息大小。
通过调用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将优先于此调用,因此传递值&gt; MAXMSGL无效。
现在,当您调用put()
时,任何没有分段的消息都将导致错误2030(MQRC_MSG_TOO_BIG_FOR_Q)或2031(MQRC_MSG_TOO_BIG_FOR_Q_MGR)。通过分段,现在应该拆分消息并将段放在队列中。
希望这有助于某人!