2

IBM のヘルプ ガイドで提案されているように、メッセージ フラグ MQMF_SEGMENTATION_ALLOWED と 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 では利用できない、そのような明白なものなど...)、または試してみるべきことの提案はありますか?

ところで、わずかにコンテキストフリーのコードサンプルについてお詫び申し上げます。私の問題について人々が持っている質問にできる限り答えようとします.

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 に答える