【发布时间】:2015-01-21 11:09:15
【问题描述】:
我正在尝试将我的自定义 ActiveMQ 生产者配置为使用 XA 事务。不幸的是,它没有按预期工作,因为消息会立即发送到队列而不是等待事务提交。
这里是制作人:
public class MyProducer {
@Autowired
@Qualifier("myTemplate")
private JmsTemplate template;
@Transactional
public void sendMessage(final Order order) {
template.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
ObjectMessage message = new ActiveMQObjectMessage();
message.setObject(order);
return message;
}
});
}
}
这是模板和连接工厂配置:
<bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:/activemq/ConnectionFactory" />
</bean>
<bean id="myTemplate" class="org.springframework.jms.core.JmsTemplate"
p:connectionFactory-ref="jmsConnectionFactory"
p:defaultDestination-ref="myDestination"
p:sessionTransacted="true"
p:sessionAcknowledgeModeName="SESSION_TRANSACTED" />
如您所见,我使用的是通过 JNDI 启动的 ConnectionFactory。它是在 JBoss EAP 6.3 上配置的:
<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1">
<resource-adapters>
<resource-adapter id="activemq-rar.rar">
<module slot="main" id="org.apache.activemq.ra"/>
<transaction-support>XATransaction</transaction-support>
<config-property name="ServerUrl">
tcp://localhost:61616
</config-property>
<connection-definitions>
<connection-definition class-name="org.apache.activemq.ra.ActiveMQManagedConnectionFactory" jndi-name="java:/activemq/ConnectionFactory" enabled="true" use-java-context="true" pool-name="ActiveMQConnectionFactoryPool" use-ccm="true">
<xa-pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>20</max-pool-size>
</xa-pool>
</connection-definition>
</connection-definitions>
</resource-adapter>
</resource-adapters>
</subsystem>
当我调试时,我可以看到 JmsTemplate 配置正确:
- 它引用了有效的连接工厂 org.apache.activemq.ra.ActiveMQConnectionFactory
- 连接工厂引用了有效的事务管理器:org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl
- 已交易的会话设置为 true
- 会话确认模式设置为 SESSION_TRANSACTED(0)
您知道为什么这些消息会立即推送到队列中,并且在事务回滚时不会被删除(例如,当我在“sendMessage”方法的末尾抛出异常时?
【问题讨论】:
标签: jboss transactions jms activemq spring-jms