2012-11-05 33 views
1

我試圖從使用ANSI-C和MQGET函數的隊列中接收消息。問題是我總是得到錯誤2010(MQRC_DATA_LENGTH_ERROR)。來自隊列的MQGET大消息(> 4MB)導致錯誤2010

我發現這個錯誤涉及MQGET調用(DataLength)的參數7。我的隊列中的消息有7157460個字節。我用於MQGET的通道將「最大消息長度」設置爲104857600(以及包含消息的隊列)。

我即使使用MQGET從這個例子: http://www.capitalware.biz/dl/code/c/msg2file.zip

我仍然結束了2010年的錯誤我在做什麼錯?我應該以某種方式增加MQSERVER環境變量中消息的最大大小?

MQGET調用:

/* ... */ 
MQLONG messlen;   /* message length received  */ 

MQGET(Hcon,     /* connection handle     */ 
     Hobj,    /* object handle      */ 
     &md,     /* message descriptor    */ 
     &gmo,    /* get message options    */ 
     buflen,    /* pBuffer length     */ 
     pBuffer,    /* pointer to message buffer   */ 
     &messlen,   /* message length     */ 
     &CompCode,   /* completion code     */ 
     &Reason);   /* reason code      */ 
+0

您使用的是什麼版本的MQ? 2010年的文檔中提到「DataLength參數無效,參數指針無效或指向只讀存儲器(檢測無效的參數指針並不總是可能的;如果檢測不到,則無法預測結果) 如果BufferLength參數超出了爲客戶端通道協商的最大消息大小,則也可以在MQGET,MQPUT或MQPUT1調用中將此原因返回給MQ MQI客戶端程序。「所以檢查是否有這種情況。 – Shashi

+0

我不知道您的配置,但是我在z/OS上,其中> 4MB是單獨購買的選件。所以在這裏它永遠不會工作這可能是你的問題嗎? –

+0

我在Unix上使用Websphere MQ 7.5。 MQGET程序位於另一個unix(AIX)上。我已閱讀關於此問題的文檔,但這些對我無效。嘗試閱讀我在帖子中給出的msg2文件的源代碼。 – Cleankod

回答

1

我知道了!答案是使用MQCONNX調用來連接到隊列管理器。

例子:

#include <cmqxc.h> 
/* ... */ 
MQCNO mqcno = {MQCNO_DEFAULT} ; /* Connection options */ 
MQCD mqcd = {MQCD_CLIENT_CONN_DEFAULT}; /* Channel Defs */ 

/* ... */ 
mqcd.MaxMsgLength = 104857600L; /* 100 MB */ 

MQCONNX(mQueueManager.Name, 
    &mqcno, 
    &mQueueManager.ConnectionHandle, 
    &mQueueManager.CompletionCode, 
    &mQueueManager.ReasonCode); 

它的工作就像一個魅力!

但請記住 - 如果您發現自己需要增加最大郵件大小 - 請三思。設計可能有問題。換句話說 - MQ不應該用於傳輸大消息。 MQ File Transfer Edition是當時的解決方案之一。

+0

很高興你能解決它!我對你的帖子做了一個小修改。從v7.5開始,FTE包裝已從單機產品變爲與WMQ集成並作爲權利出售。還有一個單獨的部件號和許可證費用,而不是單獨的下載和安裝,只需打開該功能即可。 –

+0

這就是我的意思。我想我已經簡化了這句話。不管怎麼說,還是要謝謝你! – Cleankod