1
我想配置我的自定義ActiveMQ生產者使用XA事務。不幸的是,它沒有按預期工作,因爲消息立即發送到隊列中,而不是等待事務提交。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" />
正如你可以看到我使用的ConnectionFactory通過JNDI啓動。它是在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」方法的末尾拋出異常時?
是的,我有 和mode被設置爲「proxy」。我發現交易攔截器沒有出現在堆棧跟蹤中。然後我意識到@Transactional方法並沒有通過接口調用,所以spring-aop沒有添加事務攔截器(spring-aop的非常常見的限制)。當我確定一切正常。謝謝你的線索! –
Konrad
2015-01-21 16:47:20