在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我读了
这让我感到困惑;我希望不要在这里声明acknowledgeMode (因为我们处于交易会话中)在事务会话中(请参阅使用JMS API本地事务),在提交事务时会自动进行确认。如果回滚事务,则重新传递所有消耗的消息。
答案 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