Ibm mq 如何获取有关从队列检索的消息的信息

Ibm mq 如何获取有关从队列检索的消息的信息,ibm-mq,xms,Ibm Mq,Xms,我是IBM MQ的新手。使用以下代码,我可以轻松地将消息放入队列并获取该消息 public void QueuePut() { queue = queueManager.AccessQueue("Q1", MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING); MQMessage message = new MQMessage(); message.WriteString("stackoverflow");

我是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'中阅读它。

以下是来自的相关MQ属性:

我无法测试这一点,因为我没有测试这一点所需的所有组件,但我相信,这应该是可行的:

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");

BaseQueueName
将指向别名队列所指的实际队列。在这种情况下,为获取队列而打开的队列就是真正的队列本身。因此,
BaseQueueName
不会指向任何东西

在打开队列时使用
MQC.MQCA_BASE_Q_NAME
是不正确的,因为它不是队列打开选项。所有队列打开选项都以
MQOO
开头

您可以使用PCF类查询别名队列并查找其基本队列名称。但目前我不知道是否有办法找到基本队列的别名

编辑:

别名队列
实际上不像
本地队列
那样是一个队列。顾名思义,它是本地队列的另一个名称。它不会保存任何消息。当应用程序打开别名队列时,队列管理器将其解析为实际队列

别名有助于

1) 隐藏它所指向的队列/主题。这样,应用程序不受对队列/主题的任何更改的影响


2) 为应用程序提供不同级别的权限。一个应用程序可以放置但不能获取,而另一个应用程序可以获取但不能放置到同一队列。

MQGET
返回时,
MQGMO
结构有一个字段,告诉您从中检索消息的本地队列的名称,即基本队列,即使您是从别名获取消息的

阅读有关
MQGMO
字段
ResolvedQName

上面是C过程MQ API,要将其转换为您正在使用的OO类,这意味着您需要使用带有两个参数的
queue.Get
,第二个参数是
MQGetMessageOptions
的实例


然后,您应该能够访问
MQGetMessageOptions

中的
ResolvedQName
字段。我觉得这不对,如果消息被放入队列Q1中,您如何读取Q2队列中的消息呢?@Alioza Q1是Q2的别名。您是否仍然需要了解原始队列名称被放入的位置?我找到了一种解决方法,通过将别名队列指向主题对象,然后将目标队列订阅到主题字符串来实现这一点。这将在MQMD中添加属性,这些属性可以指示放入的原始队列名称。如果您想让我写下详细信息作为答案,请告诉我?在打开队列时使用MQC.MQCA_BASE_Q_NAME是不正确的,因为它不是队列打开选项。所有队列打开选项都以MQOO_开头。上面的代码不起作用。假设我们发现了一个基本队列的别名,我们如何知道消息来自某个别名或另一个别名。这是Q1基Q2和Q3别名。我读了Q1,得到了消息,我还知道Q1的别名。那么呢?我们如何知道信息来自第二季度。如果它来自Q3,那么你的意思是我不能做我想做的事情。这是一条信息,我把它放在“Q1”,我从“Q2”读它。在您看来,我们应该阅读QueueGet函数上的MQGetMessageOptions,它给出了Q2的ResolvedQName再次是Q2。但如果我们读的是Q1,那么它的解析QName='Q2',所以你的解决方案是正确的。也就是说,Q2是本地队列,而Q1是别名队列。它将始终在ResolvedQName字段中别名的底部为您提供本地q。如果该队列名称与您从中获得的名称不匹配,那么您可以从中暗示一些东西。