2017-03-07 77 views
1

我正在處理使用C API連接到IBM MQ 8.0的應用程序,並調用MQCONNX函數。我同時運行此應用程序的多個實例,並且當我打開MQ Explorer列出隊列管理器的應用程序連接時,我會看到每個連接的條目。但是,這些條目都具有相同的「應用程序名稱」(可執行文件的名稱),從而難以區分哪些實例已連接或未連接。連接到IBM MQ時更改「應用程序名稱」?

是否可以更改在MQ Explorer中顯示爲「應用程序名稱」的值?我想從我的應用程序傳遞一個實例標識符,但仔細查看MQCONNX的文檔,似乎沒有任何選項適用。

+0

你沒有提到你的客戶端應用程序在哪個操作系統上運行,但是我添加了另一個用於Linux的工作來設置程序中的進程名稱,我發現了一些類似的Windows和Solaris的答案,如果你使用的是不同的操作系統,也可以爲你工作。 – JoshMc

回答

3

在APPLTAG下的IBM MQ v8.0知識中心頁面「DISPLAY CONN」中,它顯示了MQ如何確定值。你沒有說明什麼操作系統客戶端應用程序正在運行上,用於Unix和Windows的信息是:

  • UNIX進程
    注意
    在HP-UX,如果進程名超過14個字符,只顯示前14個字符。在所有其他平臺上,如果進程名稱超過28個字符,則只顯示前28個字符。
  • Windows進程
    注意
    這包括完整的程序路徑和可執行文件名。如果超過28個字符,則只顯示最後的28個字符。

如前所述通過@Attila Repasi您可以在每個消息的MQMD改變APPLNAME使用設置所有上下文,這並不影響在MQ資源管理器中顯示的「應用程序名稱」。


一個解決辦法我想如果你在Unix上運行的是創建單獨的符號鏈接到你的程序,每個符號鏈接都有不同的名稱。如果使用不同的符號鏈接名稱運行每個副本,則這應該反映爲MQ Explorer顯示的「應用程序名稱」。


我在Linux上測試的第二項工作是在不需要符號鏈接的情況下工作,即在程序中設置進程名稱。我第一次嘗試寫入argv[0],但我發現這改變了ps輸出中的進程名稱,但它不會更改MQ顯示的APPLTAG值。我在Linux中找到的工作方式如下,這必須在MQCONN之前調用。

char *process_name = "samplename\0"; 
prctl(PR_SET_NAME,process_name,NULL,NULL,NULL); 

@ Fusspawn的回答爲 「How to name a thread in Linux? [duplicate]」 幫助上述語法。

請注意,在Unix操作系統MQI客戶端上進行測試時我發現在Linux和Solaris上進程名稱被OS限制爲15個字符。僅在AIX上,RAPPLTAG才能顯示完整的28個字符。 Windows MQI客戶端也能夠顯示完整的28個字符。 IBM知識中心僅指出HP-UX限制爲14個字符,但表示在其他Unix平臺上限制爲28個字符,這對於Linux和Solaris限制爲15個字符的情況似乎不正確。

有用的答案:


在人們誰可能是提供信息的利益使用適用於Java API的IBM MQ類,知識中心中的「DISPLAY CONN」頁面不會注意到適用於Java API客戶端的IBM MQ類可以使用這個值。這在IBM MQ知識中心頁面「Setting up the IBM MQ environment for IBM MQ classes for Java」中標記爲通過設置應用程序名稱來識別與隊列管理器的連接。這是自v7.5以來纔可用的。

應用程序名稱被限制爲28個字符,而較長的名稱被截斷以適合。如果未指定應用程序名稱,則會提供默認值。默認名稱基於調用(main)類,但如果此信息不可用,則使用文本WebSphere MQ Client for Java。

...

要在傳遞給MQQueueManager構造函數的屬性哈希表中設置應用程序名稱,請使用鍵名將該名稱添加到屬性哈希表中。MQConstants.APPNAME_PROPERTY


IBM MQ類JMS API客戶端也可以設置這個值。這在IBM MQ知識中心頁面「Properties of IBM MQ classes for JMS objects > APPLICATIONNAME」中註明。這是自v7.5以來纔可用的。

適用對象

連接工廠,的QueueConnectionFactory,TopicConnectionFactory的, XAConnectionFactory,XAQueueConnectionFactory, XATopicConnectionFactory

JMS管理工具長的名字:APPLICATIONNAME

JMS管理工具簡稱:APPNAME

編程訪問

塞特斯/吸氣劑

  • MQConnectionFactory.setAppName()
  • MQConnectionFactory.getAppName()

任何有效的字符串,它是不再是n 28個字符。如有必要,更長的名稱 可通過刪除主要的軟件包名稱進行調整。例如,如果調用類爲com.example.MainApp,則使用完整的 名稱,但如果調用類爲 com.example.dictionaryAndThesaurus.multilingual.mainApp,則會使用名稱 multilingual.mainApp,因爲它是 類別名稱和最右邊的包名稱中最長的組合,它適合可用的 長度。

如果類名本身長度超過28個字符,則會將其截斷爲 。例如, com.example.mainApplicationForSecondTestCase變爲 mainApplicationForSecondTest。

1

您可以使用MQOO_SET_ALL_CONTEXT和MQPMO_SET_ALL_CONTEXT選項更改您發送的消息的應用程序名稱。

但我不認爲你可以更改顯示在通道狀態上的應用程序名稱。

但是,您可以在不同的操作系統用戶下運行不同的應用程序實例。用戶名也顯示在狀態信息中,如果您不覆蓋MCA用戶標識,則可以將其用於您的目的。 (或者你可以做,通過使用SSL連接,並使用SSL證書信息顯示區分你的應用情況類似的東西。)

1

雖然我與阿提拉同意你「可以」使用MQOO_SET_ALL_CONTEXT和MQPMO_SET_ALL_CONTEXT選擇,我強烈建議你不要這樣做。

如果您確實使用這些選項,那麼您需要了解後果。每封郵件的以下MQMD字段將被留空和/或null,並且它是由應用程序來填充他們:

  • AccountingToken
  • ApplIdentityData
  • ApplOriginData
  • PutApplType
  • PutApplName
  • PutDate
  • PutTime
  • UserIdentifier

那麼,您要花費多少精力才能在MQ Explorer中看到一些毫無意義的東西?

此外,要使用這些選項,UserId(或組)需要爲其打開的隊列設置「+ set」MQ OAM權限。

+0

更正:'+ set'權限允許應用程序在隊列上執行'MQSET'調用。對於'MQOO_SET_ALL_CONTEXT','qmgr'和隊列都需要'+ setall'權限。 – JoshMc