Постоянные сообщения устойчивого подписчика JMS не сохраняются в базе данных

Я использую weblogic 10.3. Я пытаюсь настроить надежную подписку с постоянными сообщениями, поддерживаемыми хранилищем jdbc (в Oracle DB). У меня есть тема, которую MDB слушает как постоянный подписчик. В сценарии-1: если я отправлю сообщение, оно попадет в MDB.

В сценарии-2: я приостанавливаю MDB, надеясь, что сообщения, отправляемые в тему, останутся, пока они не будут использованы MDB (которая является единственным зарегистрированным постоянным подписчиком). Но когда я отправляю сообщение в тему, оно ненадолго появляется там, а затем исчезает (я вижу это с помощью HermesJMS).

У меня сложилось впечатление, что сообщения, поскольку они не используются MDB, в этом случае будут регистрироваться в хранилище JDBC, но таблица WLSTORE в oracle db также не сохраняет никаких сообщений.

Позже я узнал, что сообщения отображаются в теме > постоянные подписчики > Показать сообщения в консоли администратора.

Так что, по-видимому, происходит то, что тема не хранит сообщение, а постоянная подписка, зарегистрированная под ней, хранит его до тех пор, пока сообщение не будет использовано.

Вопрос -1) Но то, что сообщения не попадают в хранилище jdbc на базе Oracle, все равно не имеет смысла? Что я здесь делаю неправильно?

Вопрос -2) Даже когда я возобновляю работу MDB, чтобы начать прослушивание сообщений, тема продолжает показывать все сообщения, все еще нетронутые, под постоянными подписчиками (в консоли администратора) - я надеялся, что они будут удалены оттуда по мере обработки. единственным зарегистрированным постоянным подписчиком.


person robin bajaj    schedule 23.01.2013    source источник


Ответы (2)


Сообщения не отображаются в топике, так как топики и очереди — это разные модели общения. Предположим, у вас есть постоянная тема с двумя (постоянными) подписчиками: А и Б. Вы хотите, чтобы они оба получили сообщение. Чтобы гарантировать это, A и B должны подтвердить, что они получили сообщение. Это также является причиной того, что вы получаете все сообщения повторно доставленными после повторного подключения, ваш MDB должен вызвать commit() для сообщения, чтобы сообщить серверу, что обработка завершена. Это также объясняет, почему сам топик не хранит сообщения, они хранятся для каждого длительного потребителя. Потому что A может зафиксировать сообщение, а B — нет (может быть «не в сети»). Так что вам нужна копия для каждого потребителя.

person SirRichie    schedule 24.01.2013

Я нашел пару интересных вещей в дальнейшем тестировании -

для вопроса 1) _ Даже если я не настрою хранилище jdbc для сервера JMS в weblogic 10, у него есть собственное хранилище файлов по умолчанию, которое всегда работает без какой-либо настройки. Это хранилище файлов используется для хранения постоянных сообщений для устойчивых подписок, и это хранилище будет хранить сообщения даже при перезапуске сервера.

Дополнительные сведения можно найти на http://docs.oracle.com/cd/E17904_01/web.1111/e13701/store.htm#i1130575

для вопроса 2)_ Моя MDB ожидала сообщения XML в определенном формате, во время тестирования, чтобы упростить задачу, я начал отправлять небольшие текстовые сообщения и забыл, что они не будут успешно обработаны в MDB. поэтому MDB не работал со всеми этими сообщениями и откатывал транзакцию, поэтому сообщения никогда не удалялись, когда я возобновил работу MDB.

Это в значительной степени отвечает на оба моих вопроса.

person robin bajaj    schedule 24.01.2013