2015-06-10 100 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。如果该队列名称与您从中获得的名称不匹配,则可以暗示其中的某些内容。 –

相关问题