Ответ 1
Попробуйте использовать другое свойство конфигурации acitivation:
@ActivationConfigProperty( propertyName = "maxSession", propertyValue = "someNumber")
где someNumber - максимальное количество необходимых вам экземпляров.
У меня возникла проблема со следующей настройкой:
Приложение 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
Попробуйте использовать другое свойство конфигурации acitivation:
@ActivationConfigProperty( propertyName = "maxSession", propertyValue = "someNumber")
где someNumber - максимальное количество необходимых вам экземпляров.
Если JBoss 4 имеет возможность ограничить экземпляры сеанса без состояния bean, одним из вариантов может быть переместить код обработки сообщений на этот bean и передать ему входящие сообщения JMS. (IIRC любые сбои в bean также приведут к тому, что сообщение JMS не будет подтверждено, чтобы оно автоматически повторилось).