Нужно получить самое старое MQMessage из MQQueue

Привет, я новичок в IBM MQ. Здесь мое требование состоит в том, чтобы получить самое старое MQMessage из MQQueue независимо от установленного приоритета и отобразить его в JSP для некоторых целей мониторинга. В существующем коде

qMgr = new MQQueueManager(qManager);

    int openOptions = MQC.MQOO_INQUIRE | MQC.MQOO_BROWSE|MQC.MQOO_INPUT_SHARED;
    MQQueue eventQueue = qMgr.accessQueue(qName, openOptions, null, null, null);
    MQMessage retrievedMessage = new MQMessage();   
    MQGetMessageOptions gmo = new MQGetMessageOptions();
            gmo.options = MQC.MQGMO_BROWSE_FIRST;
    eventQueue.get(retrievedMessage, gmo); 

Здесь я могу получить MQMessage, но это может быть не самое старое сообщение в очереди. Я понятия не имею об этом. Пожалуйста, помогите мне, есть ли способ получить это.


person Karthik B    schedule 18.02.2011    source источник


Ответы (1)


Если очередь FIFO, то ваш просмотр вернет самое старое сообщение. Но если очередь настроена на приоритетную доставку, вам придется просматривать очередь, пока не будет найдено первое сообщение с самым низким приоритетом. Ваш фрагмент кода указывает, что это очередь событий. Если это относится к очередям SYSTEM.*.EVENT, то они всегда должны находиться в режиме FIFO. Даже если администратор изменяет их на приоритетную доставку, все сообщения о системных событиях создаются с одинаковым приоритетом.

Трудность, с которой вы сталкиваетесь с сообщениями с упорядоченным приоритетом, заключается в том, что вы можете игнорировать более низкие приоритеты, но не более высокие. Например, если вы укажете приоритет 5 при просмотре, а какие-либо сообщения имеют приоритет 4 или ниже, они не будут возвращены. Но будут возвращены сообщения или сообщения с более высоким приоритетом, и не только сообщения с приоритетом 5, но скорее сообщения с приоритетом 9, за которыми следуют сообщения с приоритетом 8 и так далее. Таким образом, вы не сможете выборочно просматривать первое сообщение в каждом приоритете, а вместо этого будете вынуждены просматривать до тех пор, пока не найдете первое сообщение с приоритетом 0, чтобы знать, что вы видели самое старое сообщение в очереди, если порядок доставки очереди установлен на Приоритет.

Возможно, стоит просмотреть методы в com.ibm.mq.pcf, чтобы узнать, как запрашивать атрибуты очереди. Если очередь FIFO, просто просмотрите первое сообщение. Если нет, просмотрите длину очереди, сохранив первое полученное сообщение с каждым приоритетом, сравните метку времени с любым сообщением с более высоким приоритетом и отбросьте более новое.

Обратите внимание, что транзакции повлияют на вашу возможность просматривать сообщения. Любое сообщение, хранящееся в точке синхронизации, будет недоступно для просмотра. Будет возвращено самое старое сообщение, не находящееся в точке синхронизации.

Наконец, если вы пытаетесь определить состояние очереди Интервал обслуживания очереди или события QStatus может предоставить то, что вам нужно, и избежать накладных расходов на просмотр глубоких очередей.

person T.Rob    schedule 18.02.2011