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

4

3 回答 3

1

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

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

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

编辑:

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

别名有帮助

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

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

于 2015-06-11T03:29:10.000 回答
1

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

在此处阅读有关MQGMO字段的信息ResolvedQName

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

请参阅“使用 .NET > 处理消息”

然后,您应该能够访问ResolvedQName.MQGetMessageOptions

于 2015-06-11T21:16:11.680 回答
0

以下是IBM 文档中的相关 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");
于 2015-06-10T19:23:05.123 回答