2015-06-10 99 views
3

我是IBM MQ中的新成員。使用下面的代碼,我可以輕鬆地將消息放入隊列中並獲取該消息。如何獲取有關從隊列中檢索的消息的信息

public void QueuePut() 
{ 
     queue = queueManager.AccessQueue("Q1", MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING); 
     MQMessage message = new MQMessage(); 
     message.WriteString("stackoverflow"); 

     MQPutMessageOptions putMessageOptions = new MQPutMessageOptions(); 
     putMessageOptions.Options += MQC.MQPMO_ASYNC_RESPONSE; 

     queue.Put(message, putMessageOptions); 
} 


public void QueueGet() 
{ 

     queue = queueManager.AccessQueue("Q2", MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING); 
     MQMessage gotMessage = new MQMessage(); 

     queue.Get(gotMessage); 

     string str = message.ReadString(gotMessage.MessageLength); 
} 

你可以很容易地看到我正在寫一個消息,「Q1」和「Q2」讀它,因爲Q1是別名隊列

現在,我想的事情是獲得有關信息我在QueueGet函數中獲得的消息。我想知道的是gotMessage來自'Q1',即使我正在'Q2'中閱讀它。

+0

這聽起來不太合適,如果將它放入隊列Q1,您如何從Q2隊列中讀取消息? – Alioza

+0

@Alioza Q1是Q2的別名。 – Shashi

+0

你是否仍然需要找出原始隊列的名稱?我發現了一個解決方法,它允許將別名隊列指向主題對象,然後將目標隊列訂閱到主題字符串。這將在MQMD中添加可以指示原始隊列名稱的屬性。讓我知道你是否希望我把這些細節寫成答案? – JoshMc

回答

0

下面是從IBM documentation相關的MQ屬性:

MQ_Property_From_IBM_Documentation

我不能對此進行測試,因爲我沒有所有必需的組件,以測試這一點,但我相信,這應該工作:

string queueName = "Q2"; 
queue = queueManager.AccessQueue(queueName, MQC.MQOO_OUTPUT 
             + MQC.MQOO_INQUIRE 
             + MQC.MQCA_BASE_Q_NAME 
             + MQC.MQOO_FAIL_IF_QUIESCING); 

Console.WriteLine("QueueName=" + queueName 
        + " BaseQueueName=" + mqQueue.BaseQueueName); 

if (queueName.Equals(mqQueue.BaseQueueName)) 
    Console.WriteLine("Message is coming from a different underlying queue"); 
+0

打開隊列時使用MQC.MQCA_BASE_Q_NAME是不正確的,因爲它不是隊列打開選項。所有隊列打開選項都以MQOO_開頭。上面的代碼將不起作用。 – Shashi

1

BaseQueueName將指向別名隊列引用的真實隊列。在這種情況下,打開隊列以獲得隊列是真正的隊列本身。因此BaseQueueName不會指向任何東西。

在打開隊列時使用MQC.MQCA_BASE_Q_NAME是不對的,因爲它不是隊列打開選項。所有隊列打開選項均以MQOO_開頭。

您可以使用PCF類查詢別名隊列並查找其基本隊列名稱。但目前我不知道是否有辦法查找基本隊列的別名。

編輯:

Alias queue是不是真的像Local queue的隊列。顧名思義,這是本地隊列的另一個名稱。它不會持有任何消息。當應用程序打開別名隊列時,隊列管理器將其解析爲實際隊列。

別名幫助

1)隱藏它指向的隊列/主題。這樣,應用程序不受任何隊列/主題更改的影響。

2)爲應用程序提供不同級別的權限。一個應用程序可以放入但不能獲得,而另一個應用程序可以獲取但不能放入同一個隊列。

+0

讓我們說我們找到了一個基本隊列的別名,我們怎麼能知道這個消息來自某個別名或別的別名。這是Q1基於Q2和Q3別名。我讀Q1,我得到了消息,也知道Q1的別名。那麼呢?我們怎麼能知道這個消息來自Q2。如果它來自Q3 – brtb

+0

請參閱上面的我的編輯。 – Shashi

+0

所以你的意思是我不能做我想要的 – brtb

1

MQGETMQGET返回時,MQGMO結構中有一個字段,告訴您從中檢索消息的本地隊列的名稱,即基本隊列,即使您從別名中獲取它也是如此。

閱讀關於MQGMO字段ResolvedQNamehere

上面是C程序MQ API,把這種成您所使用的面向對象的類,這意味着需要使用queue.Get具有兩個參數,第二個是一個MQGetMessageOptions的實例。

"Using .NET > Handling Messages"

然後,您應該能夠訪問在MQGetMessageOptionsResolvedQName領域。

+0

有消息,我把它放到'Q1',我從'Q2'讀它。您認爲我們應該在QueueGet函數上讀取MQGetMessageOptions,並且它給出了Q2的ResolvedQName又是Q2。但是,如果我們正在閱讀Q1,那麼它的ResolvedQName ='Q2',所以你的解決方案是真實的。也就是說,Q2是本地隊列,而Q1是別名隊列 – brtb

+0

它將始終爲ResolvedQName字段中的別名基部提供本地q。如果該隊列名稱與您從中獲得的名稱不匹配,則可以暗示其中的某些內容。 –

相關問題