Бин, управляемый сообщениями, и порядок потребления сообщений - PullRequest
2 голосов
/ 15 марта 2011

У меня есть MDB, который подписывается на тему, которая отправляет сообщения, содержимое которых в конечном итоге сохраняется в БД.

Я знаю, что MDB объединяются, и поэтому контейнер может обрабатывать более одного входящего сообщенияв параллели.В моем случае важен порядок, в котором эти сообщения используются (а затем сохраняются).Я не хочу, чтобы пул экземпляров MDB потреблял, а затем сохранял сообщения в другом порядке по мере их публикации в теме JMS.

Может ли это быть проблемой?Если да, есть ли способ указать контейнеру следовать строгому входящему порядку при потреблении сообщений?

Ответы [ 2 ]

2 голосов
/ 15 марта 2011

Скопировано с там:

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

  • Установите для max-beans-in-free-pool значение 1 для MDB. Это гарантирует, что MDB является единственным потребителем сообщения.

  • Если ваши MDB развернуты в кластере, разверните их на одном узле в кластере, [...].

  • Чтобы обеспечить порядок сообщений в случае отката и восстановления транзакции, настройте фабрику настраиваемых соединений с параметром MessagesMaximum, равным 1, и убедитесь, что задержка повторной доставки не настроена. Для получения дополнительной информации см. [...].
2 голосов
/ 15 марта 2011

Вы должны иметь возможность ограничить размер пула MDB до 1, что гарантирует обработку сообщений в правильном порядке.

Конечно, если вам все еще нужен параллелизм, у вас есть несколько вариантов, но это действительно зависит от данных.

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

Если, с другой стороны, некоторые части логики, связанной с приходом сообщения, могут выполняться параллельно, в то время как другие биты не могут, тогда вам нужно будет разделить логику на параллельные ok и параллельные-not-ok части, и обработайте эти биты соответственно.

...