Как получить информацию о сообщении, полученном из очереди

Я новичок в 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:

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");
Другие вопросы по тегам