我正在尝试配置我的自定义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配置正确:
您是否知道为什么这些消息会立即被推送到队列中并且在事务回滚时不会被删除(例如,当我在&#34; sendMessage&#34;方法?#/ p结束时抛出异常时>
答案 0 :(得分:1)
您需要显示其余配置(事务管理器等)。
看起来您没有在应用程序上下文中启用事务,因此模板将提交事务本身。
你在上下文中有<tx:annotation-driven/>
吗?