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

时间:2015-06-10 14:26:25

标签: 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");

        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函数中获得的消息的信息。我想知道的是,即使我在'Q2'中读到它,gotMessage也来自'Q1'。

3 个答案:

答案 0 :(得分:1)

__init__.py将指向别名队列引用的真实队列。在这种情况下,打开以获取队列的队列是真正的队列本身。因此BaseQueueName不会指向任何内容。

在打开队列时使用BaseQueueName是不对的,因为它不是队列打开选项。所有队列打开选项均以MQC.MQCA_BASE_Q_NAME开头。

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

编辑:

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

别名帮助

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

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

答案 1 :(得分:1)

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

了解MQGMO字段ResolvedQName here

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

请参阅"Using .NET > Handling Messages"

然后,您应该可以访问MQGetMessageOptions中的ResolvedQName字段。

答案 2 :(得分: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");