容器管理事务和Session.AUTO_ACKNOWLEDGE

时间:2017-02-06 19:37:46

标签: java-ee transactions ejb ejb-3.0 message-driven-bean

the The Java EE 6 Tutorial, Chapter 17 A Message-Driven Bean Example中, 我偶然发现了这个:

A = { 'one': '1', 'two': '2', 'three': '3' }
B = { 'four': '4', 'five': '5', 'six': '6' }
A_keys = ['one', 'two']
B_keys = ['five']
merged = {**{k:v for k,v in A.items() if k in A_keys}, **{k:v for k,v in B.items() if k in B_keys}}

自MDB进行交易 - (交易属性的默认值指向 @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; ... TransactionAttributeType.REQUIRED

如何让TransactionManagementType.CONTAINER)有任何意义?

Controlling Message Acknowledgment我读了

  

在事务会话中(请参阅使用JMS API本地事务),在提交事务时会自动进行确认。如果回滚事务,则重新传递所有消耗的消息。

这让我感到困惑;我希望不要在这里声明acknowledgeMode (因为我们处于交易会话中)

1 个答案:

答案 0 :(得分:1)

简而言之:此属性不会影响使用CONTAINER事务的MDB消息确认。

要获得答案,您可以查看EJB 3.2 specification

  

JMS消息驱动的bean不应该尝试使用JMS API   消息确认。 MES    - sage确认由容器自动处理。如果消息驱动的bean使用con    - 由tainer管理的事务划分,消息确认作为事务提交的一部分自动处理。如果   豆人年龄的交易划分是我们的,消息收据   不能成为bean管理的事务的一部分,在这种情况下,   收据由集装箱确认。如果是豆管理的   使用事务划分,Bean Provider可以   指示是否为JMS AUTO_ACKNOWLEDGE语义或   DUPS_OK_ACKNOWLEDGE语义应该通过使用来应用   MessageDriven注释的activationConfig元素或   通过使用activation-config-property部署描述符元素。用于指定确认模式的属性名称是   acknowledgeMode。如果未指定acknowledgeMode属性,   假设JMS AUTO_ACKNOWLEDGE语义。的价值   acknowledgeMode属性必须是自动确认或   对于JMS消息驱动的bean,Dups-ok-acknowledge。

因此,在您的情况下,只有通过添加将bean切换到BMT时,此属性才会受到影响 @TransactionManagement(TransactionManagementType.BEAN)注释。

另外,我建议您阅读有关JMS中的交易和重新发送的this article