powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Предварительный просмотр сообщения из очереди mq
8 сообщений из 8, страница 1 из 1
Предварительный просмотр сообщения из очереди mq
    #38068151
_taddy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Перед тем, как забрать (деструктивный get) сообщение из очереди, необходимо его просмотреть и выполнить с ним некоторые операции. В случае успешного выполнения всех действий, сообщение нужно из очереди удалить, иначе - оставить все как есть, через некоторое время попытаться снова. Организую это так. Очередь открываю на просмотр
Код: pascal
1.
MQOO_FAIL_IF_QUIESCING + MQOO_BROWSE + MQOO_INPUT_EXCLUSIVE


Получаю сообщение, не удаляя его
Код: pascal
1.
2.
3.
  MsgDesc := MQMD_DEFAULT;
  GetMsgOptions := MQGMO_DEFAULT;
  GetMsgOptions.Options := MQGMO_BROWSE_FIRST;


Выполняю необходимые действия, закрываю очередь, если все ок, открываю
Код: pascal
1.
MQOO_FAIL_IF_QUIESCING + MQOO_INPUT_EXCLUSIVE


и забираю с удалением.
Надо добавить возможность сегментации сообщений. Если добавить при просмотре сообщения
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  MsgDesc := MQMD_DEFAULT;
  MsgDesc.Version := MQMD_CURRENT_VERSION;
  MsgDesc.MsgFlags := MQMF_SEGMENTATION_ALLOWED;

  GetMsgOptions := MQGMO_DEFAULT;
  GetMsgOptions.Options := MQGMO_BROWSE_FIRST;
  GetMsgOptions.Options := MQGMO_COMPLETE_MSG;


то сообщение из очереди удаляется (если закомментировать последнюю строку - не удалится, но, я так понимаю, сегментация работать не будет).
Как правильно получить сегментированное сообщение из очереди на просмотр?
...
Рейтинг: 0 / 0
Предварительный просмотр сообщения из очереди mq
    #38068184
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
боюсь что эта схема не правильная

делается это немножко не так
должно быть примерно так:

1 сообщение читается деструктивно с опцией mqgmo_syncpoint
2 делаются какие-то действия
3 В случае успешного выполнения всех действий - commit, в случае неуспешного - rollback, и обеспечить задержку перед повторным чтением

или так

1 сообщение читается деструктивно с опцией mqgmo_syncpoint
2 делаются какие-то действия
3 В случае успешного выполнения всех действий - commit, в случае неуспешного - записть сообщения в вспомогательную очередь и тоже коммит
4 на вспомогательную очередь повесить обработчик, который кидает сообщения назад через какое-то время

а как на вопрос ответить - не помню
я знал но забыл
...
Рейтинг: 0 / 0
Предварительный просмотр сообщения из очереди mq
    #38068192
_taddy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новый Год,

спасибо, буду разбираться с SYNCPOINT.
...
Рейтинг: 0 / 0
Предварительный просмотр сообщения из очереди mq
    #38069224
_taddy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
C mqgmo_syncpoint проблема та же. Пока на пытаешься добавить сегментацию - работает отлично, с сегментацией - удаляет из очереди. Причем пишет, что MQBACK отработал нормально, CompCode = 0, Reason = 0, но сообщения в очереди нет.
На данный момент параметры такие
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  MsgDesc := MQMD_DEFAULT;
  MsgDesc.Version := MQMD_CURRENT_VERSION;
  MsgDesc.MsgFlags := MQMF_SEGMENTATION_ALLOWED;

  GetMsgOptions := MQGMO_DEFAULT;
  GetMsgOptions.Options := MQGMO_SYNCPOINT;
//  GetMsgOptions.Options := MQGMO_COMPLETE_MSG;


Если раскомментировать последнюю строку, удаляет сообщение из очереди.
Подскажите, пожалуйста, какие нужны настройки, чтобы и сегментация работала, и в случае неудачи сообщение не удалялось из очереди.
Вариант с дополнительной очередью очень нежелателен. Если есть возможность обойтись без нее - было бы намного лучше.
...
Рейтинг: 0 / 0
Предварительный просмотр сообщения из очереди mq
    #38072139
_taddy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Судя по документации mq, конфликтов сегментации с back быть не должно.
Получить сегментированное сообщение из очереди можно только с MQGMO_COMPLETE_MSG.
Код: sql
1.
2.
3.
4.
5.
6.
7.
This is the only option that causes the queue manager to reassemble message segments. 
If not specified, segments are returned individually to the application if they are present on the queue 
(and they satisfy the other selection criteria specified on the MQGET call). 
Applications that do not want to receive individual segments must always specify MQGMO_COMPLETE_MSG.
...
MQGMO_COMPLETE_MSG can be specified with any of the other MQGMO_* options apart from 
MQGMO_SYNCPOINT_IF_PERSISTENT, and with any of the MQMO_* options apart from MQMO_MATCH_OFFSET.


это отсюда http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic=%2Fcom.ibm.mq.csqzak.doc%2Ffr14560_.htm
По поводу back для групп и сегментированных сообщений написано так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
When an application puts or gets messages in groups or segments of logical messages, the queue manager 
retains information relating to the message group and logical message for the last successful MQPUT and MQGET calls. 
This information is associated with the queue handle, and includes such things as: 
The values of the GroupId, MsgSeqNumber, Offset, and MsgFlags fields in MQMD.
Whether the message is part of a unit of work.
For the MQPUT call: whether the message is persistent or nonpersistent.
 The queue manager keeps three sets of group and segment information, one set for each of the following: 
The last successful MQPUT call (this can be part of a unit of work).
The last successful MQGET call that removed a message from the queue (this can be part of a unit of work).
The last successful MQGET call that browsed a message on the queue (this cannot be part of a unit of work).


Пробую экспериментировать с локальными и глобальными единицами работы - но результат одинаковый, с опцией MQGMO_COMPLETE_MSG MQBACK как будто отрабатывает, но на самом деле сообщение из очереди удаляется.
Может быть имеет значение, что именно делаешь в единице работы? Но тогда почему MQBACK работает при отключенной сегментации?
...
Рейтинг: 0 / 0
Предварительный просмотр сообщения из очереди mq
    #38072569
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_taddy,

это выглядит так, как будто нужно PMR открывать

меня только вот это смущает
Код: plaintext
1.
2.
3.
  GetMsgOptions := MQGMO_DEFAULT;
  GetMsgOptions.Options := MQGMO_SYNCPOINT;
  GetMsgOptions.Options := MQGMO_COMPLETE_MSG;

это что за язык-то такой?

GetMsgOptions.Options := MQGMO_SYNCPOINT;
GetMsgOptions.Options := MQGMO_COMPLETE_MSG;

выглядит как 2 операции присваивания, а должно быть побитное или;

в С вот так

GetMsgOptions.Options = GetMsgOptions.Options | MQGMO_SYNCPOINT;
GetMsgOptions.Options = GetMsgOptions.Options | MQGMO_COMPLETE_MSG;
...
Рейтинг: 0 / 0
Предварительный просмотр сообщения из очереди mq
    #38073765
_taddy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новый Год,

спасибо огромное, глупая ошибка. Delphi это, надо MQGMO_SYNCPOINT + MQGMO_COMPLETE_MSG. Теперь работает, как надо. :)

Посоветуйте еще, пожалуйста, как бы Вы организовали процесс получения сообщение. В приложении установлен таймер, каждые N секунд оно открывает очередь, пытается забрать сообщение. Если ошибка 2033 (сообщений нет) - снова ждем N секунд. Если есть - цикл, забираем все сообщения, пока не вылетит какая-нибудь ошибка (в том числе 2033). И дальше ждем. Наверное, можно это как-то правильнее организовать. Может, с MQGMO_WAIT?
...
Рейтинг: 0 / 0
Предварительный просмотр сообщения из очереди mq
    #38074525
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_taddy,

прочитайте эту главу:

Starting WebSphere MQ applications using triggers.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Предварительный просмотр сообщения из очереди mq
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]