Как получить информацию о сообщении, полученном из очереди
Я новичок в IBM MQ. Используя следующий код, я могу легко поместить сообщение в очередь и получить это сообщение.
public void QueuePut()
{
queue = queueManager.AccessQueue("Q1", MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING);
MQMessage message = new MQMessage();
message.WriteString("stackru");
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".
3 ответа
По возвращении из MQGET
, MQGMO
Структура имеет поле, которое сообщает вам имя локальной очереди, из которой было получено сообщение, то есть базовой очереди, даже если вы получили ее по псевдониму.
Прочитать о MQGMO
поле ResolvedQName
Вот
Выше приведен процедурный MQ API C, чтобы перевести его в используемые вами классы OO, это означает, что вам нужно использовать queue.Get
с двумя параметрами, второй является экземпляром MQGetMessageOptions
,
Смотрите раздел "Использование.NET > Обработка сообщений".
После этого вы сможете получить доступ к ResolvedQName
поле в MQGetMessageOptions
,
BaseQueueName
будет указывать на реальную очередь, на которую ссылается очередь псевдонимов. В этом случае очередь, открытая для получения очередей, является самой настоящей очередью. следовательно BaseQueueName
не будет указывать ни на что.
Это не правильно использовать MQC.MQCA_BASE_Q_NAME
при открытии очереди, поскольку это не опция открытия очереди. Все параметры открытия очереди начинаются с MQOO_
,
Вы можете использовать классы PCF для запроса очереди псевдонимов и определения ее базового имени очереди. Но на данный момент я не знаю, есть ли способ найти псевдоним (ы) базовой очереди.
Редактировать:
Alias queue
на самом деле не очередь, как Local queue
, Как следует из названия, это другое название для локальной очереди. Он не будет содержать никаких сообщений. Когда приложение открывает очередь псевдонимов, администратор очередей разрешает ее в фактическую очередь.
Алиасинг помогает
1) Чтобы скрыть очередь / тему, на которую она указывает. Таким образом, на приложения не влияют какие-либо изменения в очереди / теме.
2) Обеспечение разного уровня полномочий для приложений. Одно приложение может поставить, но не получить, в то время как другое приложение может получить, но не поместить в ту же очередь.
Вот соответствующее свойство MQ из документации IBM:
Я не могу проверить это, потому что у меня нет всех необходимых компонентов для тестирования, но я считаю, что это должно работать:
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");