ActiveMQ生产者XA事务

时间:2015-01-21 11:09:15

标签: jboss transactions jms activemq spring-jms

我正在尝试配置我的自定义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
  • connection factory具有对有效事务管理器的引用:org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl
  • 会话已设置为true
  • 会话确认模式设置为SESSION_TRANSACTED(0)

您是否知道为什么这些消息会立即被推送到队列中并且在事务回滚时不会被删除(例如,当我在&#34; sendMessage&#34;方法?#/ p结束时抛出异常时>

1 个答案:

答案 0 :(得分:1)

您需要显示其余配置(事务管理器等)。

看起来您没有在应用程序上下文中启用事务,因此模板将提交事务本身。

你在上下文中有<tx:annotation-driven/>吗?