2017-02-06 4 views
1

В the The Java EE 6 Tutorial, Chapter 17 A Message-Driven Bean Example, я наткнулся на это:Container Managed Операции и Session.AUTO_ACKNOWLEDGE

@MessageDriven(mappedName="jms/Queue", activationConfig = { 
    @ActivationConfigProperty(propertyName = "acknowledgeMode", 
           propertyValue = "Auto-acknowledge"), 
    @ActivationConfigProperty(propertyName = "destinationType", 
           propertyValue = "javax.jms.Queue") 
}) 
public class SimpleMessageBean implements MessageListener { 
    @Resource 
    private MessageDrivenContext mdc; 
... 

Поскольку MDB ведутся - (значение по умолчанию для атрибутов транзакций указывает на TransactionAttributeType.REQUIRED и TransactionManagementType.CONTAINER))

как марки @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") любой смысл?

В Controlling Message Acknowledgment я прочитал

В транзакционных сессий (см Использование JMS API локальных транзакций), подтверждение происходит автоматически, когда сделка совершается. Если транзакция отменяется, все потребляемые сообщения повторно добавляются.

Это меня смутило; Я бы ожидал, что не объявит acceptMode здесь (поскольку мы находимся в транзакционной сессии)

ответ

1

Вкратце: это свойство не повлияет на подтверждение сообщения для MDB с использованием транзакции CONTAINER.

Для ответа вы можете посмотреть EJB 3.2 specification

JMS сообщениями компоненты не должны пытаться использовать API JMS для подтверждения сообщения. Mes - подтверждение кейса автоматически обрабатывается контейнером. Если обработчик, управляемый сообщениями, использует команду con - демаркацию транзакций, управляемую tainer, подтверждение сообщения автоматически обрабатывается как часть транзакционного фиксации. Если демаркация транзакций в возрасте от bean-man, мы получили уведомление, получение сообщения не может быть частью транзакции, управляемой компонентом, и в этом случае квитанция подтверждается контейнером. Если боб управляемого демаркация
транзакции используется, поставщик Bean может указать, является ли JMS AUTO_ACKNOWLEDGE семантика или DUPS_OK_ACKNOWLEDGE семантики должна применяться с помощью activationConfig элемента аннотации MessageDriven или с помощью дескриптора развертывания элемента активационной конфигурации-свойства , Имя свойства, используемое для указания режима подтверждения, - confirmMode. Если свойство confirmMode не указано, предполагается использование семантики JMS AUTO_ACKNOWLEDGE, . Значение свойства confirmMode должно быть либо автоматически подтверждено, либо Dups-ok-confirm для JMS-ведомого компонента.

Так что в вашем случае это свойство будет зависеть только если переключить компонент в ТКМ, добавляя @TransactionManagement(TransactionManagementType.BEAN) аннотацию.

Также рекомендую вам прочитать this article о транзакции и возврата судна в JMS

+0

спасибо! если вы согласны с тем, что мой вопрос полезен, вы можете вознаградить его, выставив его. – mambolis