2013-07-10 40 views
2

我試圖讓MQ v6按照IBM幫助指南中的建議使用消息標誌MQMF_SEGMENTATION_ALLOWED和放置消息選項MQPMO_LOGICAL_ORDER來分割消息。put()中忽略WebSphere MQ 6消息分段選項?

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.. */  
} 

不管我是否指定這些標誌,當我打電話把(),它總是返回虛假信息和有原因的代碼(2010)MQRC_DATA_LENGTH_ERROR。

是否有任何與v6和細分相關的常見問題(比如它在Windows上不可用,任何明顯的類似......)或任何有關嘗試的建議?

道歉的輕微上下文的代碼示例btw。我會盡我所能回答人們對我的問題所提出的問題。

回答

2

好的,我找到了解決該特定錯誤:比所述信道的最大消息長度較大不會被放置在隊列不管消息的消息是否可以分段或最大消息大小通過允許隊列和隊列管理器。

設置通道的最大消息大小不能通過調用ImqChannel::maximumMessageLength()完成。有通過命令行所需的配置變化:

輸入runmqsc YOUR_QUEUE_MANAGER_NAME

在提示時,檢查現有信道的最大消息長度(在第6版,缺省是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) for 100MB

現在您需要使用ImqChannel::maximumMessageLength(104857600)來設置頻道的代碼值,否則它將使用4MB的默認值。 MAXMSGL將優先於此調用,因此傳遞值> MAXMSGL將不起作用。

現在,當你調用put(),沒有任何的分割消息將導致錯誤2030(MQRC_MSG_TOO_BIG_FOR_Q)或2031(MQRC_MSG_TOO_BIG_FOR_Q_MGR)。通過分段,現在應將消息拆分,並將分段放置在隊列中。

希望這可以幫助別人!