[英]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配置正确:
您是否知道为什么这些消息会立即被推送到队列中,而在事务回滚时(例如,当我在“ sendMessage”方法的末尾引发异常时)不会将它们删除?
您需要显示其余的配置(事务管理器等)。
看来您没有在应用程序上下文中启用事务,因此模板正在提交事务本身。
上下文中是否有<tx:annotation-driven/>
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.