gpt4 book ai didi

c++ - put() 中忽略了 WebSphere MQ 6 消息分段选项?

转载 作者:搜寻专家 更新时间:2023-10-31 01:48:36 25 4
gpt4 key购买 nike

我正在尝试让 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 上不可用,任何类似的东西...),或任何尝试的建议?

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

最佳答案

好的,我找到了那个特定错误的解决方案:大于 channel 的最大消息长度的消息将不会被放入队列,无论消息是否可以分段或最大队列和队列管理器允许的消息大小。

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

输入 runmqsc YOUR_QUEUE_MANAGER_NAME

在提示中,检查现有 channel 的最大消息长度(在 v6 中,默认为 4MB):显示 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)

增加尺寸:

改变 channel (CHANNEL_NAME)CHLTYPE(SVRCONN)MAXMSGL(104857600) 100MB

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

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

希望这对某人有帮助!

关于c++ - put() 中忽略了 WebSphere MQ 6 消息分段选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17576586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com