2012-12-14 52 views
2

我試圖得到解決隊列名稱(即別名隊列的基本隊列名稱)通過查看對象描述符的ResolvedQName領域open_after和put1_before API出口( MQOD)。但它似乎並不包含在這些出口內的基本隊列名稱(即,它是空白的或者是一些意想不到的值,例如..'1.59.15')。但是我可以看到ObjectName已經正確設置了別名隊列名稱。爲了清楚起見,我的別名隊列和基隊列都使用相同的本地QM。獲得解決隊列名稱爲MQ的API退出別名隊列

所以我想知道是否有無論如何製作與別名隊列(開+放)或put1呼叫時獲得MQ API出口內解決隊列名稱。任何幫助,將不勝感激。

回答

1

我猜你正在使用MQPMO_SYNCPOINT選項?你是否也使用MQPMO_SYNC_RESPONSE選項?請參閱上MQPUT1話題,其中列明瞭最後一個音符:

當MQPUT1調用與MQPMO_SYNCPOINT,默認 行爲的變化發出的,所以該放操作完成 異步。這可能會導致某些 應用程序的行爲發生變化,這些應用程序依賴於返回的MQOD和MQMD 結構中的某些字段,但其中現在包含未定義的值。應用程序可以指定MQPMO_SYNC_RESPONSE以確保put 操作同步執行,並且所有相應的 字段值都已完成。

換句話說,該PUT1被移交到WMQ,且在發生名稱解析之前控制返回給程序。

在任何情況下,PUT1_BEFORE出口點不會已經解決了這個名字。假設指定了MQPMO_SYNC_RESPONSE,則應該能夠在PUT1_AFTER出口點找到它。

如果從SupportPac MA0W安裝API出口時,它分析所有的控制模塊和標誌成英文格式的列表。如果您查看該出口的輸出,您應該能夠準確查看哪些出口點和字段包含已解析的名稱和何時。

所以,一定要指定MQPMO_SYNC_RESPONSE,並考慮使用MA0W API出口作爲參考和學習工具。

+0

謝謝Rob! MA0W的痕跡讓事情變得更加清晰。 我沒有指定任何您提到的Put1調用選項,但是我的隊列的默認響應類型設置爲synchronus,所以我相信必須考慮到這一點。您說得對,PUT1_BEFORE退出從不給出解析的隊列名稱(帶或不帶MQPMO_SYNCPOINT選項)。 Howeve在OPEN_AFTER退出我可以看到已解析的隊列名稱(如果mqod版本= 3)。因此,在使用put1調用時,我們無法找到目標隊列名稱,這是一些限制。然而,PUT1_AFTER出口會在您進行靈感處理時給出已解析的隊列名稱。 – TomUrick

1

您需要閱讀cmqc.h文件中的MQOD結構。僅當應用程序使用MQOD結構的版本3(或更高版本)時,ResolvedQName字段纔可用。如果您檢查MQOD的版本號,我敢打賭你會看到它是版本1或2.

注意:MQOD的默認版本號是1.因此,ResolvedQName字段不可用。

最後,MQGMO和MQPMO結構都具有ResolvedQName領域開始與結構的版本1。

+0

謝謝羅傑! Yuo適用於MQOD版本3,已解析的隊列名由隊列管理器正確設置(在OPEN_AFTER出口中)。 MQGMO和MQPMO也具有已解析的隊列名稱,但它們僅在PUT_AFTER出口中設置,並且不在PUT1_BEFORE出口中。 此外,當前.net MQ API使用版本1的MQOD結構,並且似乎無法更改版本! – TomUrick