Как ограничить количество экземпляров MDB, слушающих очередь Jboss JMS - PullRequest
15 голосов
/ 11 февраля 2011

У меня проблема со следующей настройкой:

Приложение Java отправляет сообщения электронной почты в очередь JMS, затем MDB, прослушивающий очередь, получает сообщение электронной почты с помощью метода onMessage, открываетсоединение на SMTP Gmail, отправьте электронное письмо на SMTP и закройте соединение.Выполнение этого для всех сообщений в очереди JMS.

Это прекрасно работает, когда в очереди одновременно находится до 5 сообщений.Все сообщения одновременно обрабатываются 5 различными экземплярами MDB, поэтому у меня 5 одновременных подключений к SMTP-серверу Gmail.Но когда в очереди JMS появляется больше сообщений, я получаю сообщение об ошибке соединения с SMTP-сервером Gmail.Первые 5 сообщений отправляются правильно, но не остальная часть пакета, поэтому другие сообщения теряются, потому что их больше нет в очереди.

Так что мой вопрос: можно ли ограничить количествоЭкземпляр MDB, который будет слушать очередь JMS?Если у меня максимум 5 МБ, то даже если в очереди 1000 сообщений, для очистки очереди потребуется больше времени, но по крайней мере я не потеряю ни одного сообщения.

Любое другое предложение для устраненияэта проблема будет высоко оценена.

Вот версия Jboss:

[Сервер] ID выпуска: JBoss [Trinity] 4.2.3.GA (сборка: SVNTag = JBoss_4_2_3_GAdate = 200807181417)

и конфигурация MDB выглядит следующим образом:

@MessageDriven(activationConfig = {   
  @ActivationConfigProperty( propertyName = "destinationType", propertyValue = "javax.jms.Queue" ),   
  @ActivationConfigProperty( propertyName = "destination", propertyValue = "queue/emailQueue")  
})

Вам нужно больше?

Спасибо

РЕДАКТИРОВАТЬ 2011-02-14
Может быть, я все неправильно, желая ограничить количество экземпляров MDB.Я видел конфиг о количестве потоков JMS.Если я ограничу количество тем, которые будут публиковать в MDB, возможно, это решит мою проблему?Будет ли JMS ждать, пока MDB не станет доступным, прежде чем отправлять сообщение снова?Есть ли побочный эффект, чтобы сделать это?Ваш, хотя, пожалуйста.Спасибо
END EDIT

Ответы [ 2 ]

15 голосов
/ 26 февраля 2011

Попробуйте дополнительное свойство конфигурации acitivation:

@ActivationConfigProperty( propertyName = "maxSession", propertyValue = "someNumber")

, где someNumber - максимальное количество экземпляров, которое вы хотите.

0 голосов
/ 05 марта 2011

Если в JBoss 4 есть возможность ограничить количество экземпляров сессионного компонента без сохранения состояния, одним из вариантов может быть перемещение кода обработки сообщений в этот компонент и передача ему входящих сообщений JMS. (IIRC при любых сбоях в bean-компоненте также может привести к тому, что сообщение JMS не будет подтверждено, поэтому оно будет повторяться автоматически).

...