我是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'。
答案 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)
我无法对此进行测试,因为我没有测试所有必需的组件,但我相信,这应该可行:
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");