Как ограничить количество экземпляров MDB, слушая очередь Jboss JMS

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

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

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

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

Любое другое предложение для решения этой проблемы было бы очень оценено.

Вот версия Jboss:

[Сервер] Идентификатор выпуска: JBoss [Trinity] 4.2.3.GA(сборка: SVNTag = JBoss_4_2_3_GA date = 200807181417)

и конфигурация MDB следующая:

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

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

Спасибо

EDIT 2011-02-14
Возможно, я ошибаюсь, желая ограничить число экземпляров MDB. Я видел конфигурацию о количестве потоков JMS. Если я ограничу количество потоков, которые будут отправляться в MDB, возможно, это решит мою проблему? Будет ли JMS ждать, пока MDB не будет доступен, прежде чем отправлять сообщение снова? Есть ли побочный эффект? Пожалуйста, пожалуйста. Благодаря
END EDIT

Ответы

Ответ 1

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

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

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

Ответ 2

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