2015-06-10 2 views
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».

+0

Мне не кажется правильным, как вы можете прочитать сообщение из очереди Q2, если оно было помещено в очередь Q1? – Alioza

+0

@Alioza Q1 - это псевдоним Q2. – Shashi

+0

У вас все еще есть необходимость выяснить, к какому оригинальному имени очереди было добавлено? Я нашел работу, которая позволяет это, указывая очереди псевдонимов на предмет объектов, а затем подписывая очередь назначения на строки темы. Это добавит свойства в MQMD, которые могут указывать исходное имя очереди. Дайте мне знать, хотите ли вы, чтобы я написал подробности в качестве ответа? – JoshMc

ответ

0

Вот соответствующий MQ свойство от IBM documentation:

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"); 
+0

Неправильно использовать MQC.MQCA_BASE_Q_NAME при открытии очереди, поскольку она не является опцией открытия очереди. Все варианты открытия очереди начинаются с MQOO_. Вышеприведенный код не будет работать. – Shashi

1

BaseQueueName будет указывать на реальную очередь очередь псевдонима ссылается. В этом случае очередь, которая открывается для получения очередей, является самой реальной. Следовательно, BaseQueueName ничего не укажет.

Неправильно использовать MQC.MQCA_BASE_Q_NAME при открытии очереди, поскольку она не является опцией открытия очереди. Все варианты открытия очереди начинаются с MQOO_.

Вы можете использовать классы PCF для запроса очереди псевдонимов и поиска его имени базовой очереди. Но на данный момент я не знаю, есть ли способ найти псевдоним базовой очереди.

Edit:

Alias queue не совсем очередь как Local queue. Как следует из названия, это другое имя для локальной очереди. Он не будет содержать никаких сообщений. Когда приложение открывает очередь Alias, диспетчер очереди решает его в фактическую очередь.

Aliasing помогает

1) Для того, чтобы скрыть очереди/тема это указывает на. Таким образом, приложения не изменяются при изменении в очереди/теме.

2) Предоставление различного уровня полномочий приложениям. Одно приложение может поставить, но не получить, пока другое приложение может получить, но не поставить в одну очередь.

+0

let s сказать, что мы нашли псевдонимы базовой очереди, как мы можем знать, что сообщение исходит из определенного псевдонима или из другого псевдонима. Это Q1-базовые Q2 и Q3-псевдонимы. я прочитал Q1, и я получил сообщение, а также знаю псевдонимы Q1. Итак, тогда? как мы можем знать, что сообщение приходит из Q2. Что, если это исходит от Q3 – brtb

+0

См. Мое редактирование выше. – Shashi

+0

, так что вы имеете в виду, что я не могу делать то, что хочу – brtb

1

По возвращении из MQGET структура MQGMO имеет поле, в котором указывается имя локальной очереди, из которой было получено сообщение, т. Е. Базовая очередь, даже если вы получили ее из псевдонима.

Читайте о MQGMO поле ResolvedQNamehere

выше является C процедурный MQ API, чтобы перевести это на классы ОО вы используете, это означает, что вы должны использовать queue.Get с двумя параметрами, второй из которых является экземпляр MQGetMessageOptions.

См "Using .NET > Handling Messages"

тогда Вы должны быть в состоянии получить доступ к ResolvedQName поле в MQGetMessageOptions.

+0

есть сообщение, и я помещаю его в «Q1», и я читаю его с «Q2». По вашему мнению, мы должны прочитать MQGetMessageOptions on QueueGet, и это дает Q2 ResolvedQName снова Q2. Но если мы читаем Q1, тогда его ResolvedQName = 'Q2', чтобы ваше решение было истинным. То есть Q2 является локальной очередью, в то время как Q1 является псевдонимом – brtb

+0

Он всегда будет давать вам локальный q в базе псевдонима в поле ResolvedQName. Если это имя очереди не совпадает с тем, которое вы получаете, то вы можете что-то сказать. –

Смежные вопросы