【问题标题】:WebSphere MQ 6 message segmentation option ignored in put()?在 put() 中忽略了 WebSphere MQ 6 消息分段选项?
【发布时间】:2013-07-12 21:10:00
【问题描述】:

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

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 上不可用,任何类似的东西......),或者有什么建议可以尝试?

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

【问题讨论】:

    标签: c++ ibm-mq


    【解决方案1】:

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

    不能单独通过调用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)。通过分段,现在应该拆分消息并将分段放入队列中。

    希望这对某人有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 2011-03-28
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多