ActiveMQ 生产者 XA 事务
ActiveMQ producer XA transaction
我正在尝试配置我的自定义 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" 方法结束时抛出异常时?
您需要显示其余配置(事务管理器等)。
您似乎没有在应用程序上下文中启用事务,因此模板正在提交事务本身。
上下文中有<tx:annotation-driven/>
吗?
我正在尝试配置我的自定义 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" 方法结束时抛出异常时?
您需要显示其余配置(事务管理器等)。
您似乎没有在应用程序上下文中启用事务,因此模板正在提交事务本身。
上下文中有<tx:annotation-driven/>
吗?