【问题标题】:ActiveMQ producer XA transactionActiveMQ 生产者 XA 事务
【发布时间】:2015-01-21 11:09:15
【问题描述】:

我正在尝试将我的自定义 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”方法的末尾抛出异常时?

【问题讨论】:

    标签: jboss transactions jms activemq spring-jms


    【解决方案1】:

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

    您似乎没有在应用程序上下文中启用事务,因此模板正在提交事务本身。

    上下文中有&lt;tx:annotation-driven/&gt;吗?

    【讨论】:

    • 是的,我有 并且模式设置为“代理”。我发现堆栈跟踪中没有显示事务拦截器。然后我意识到@Transactional方法没有通过接口调用,所以spring-aop没有添加事务拦截器(spring-aop很常见的限制)。当我修复一切正常时。谢谢你的提示!
    猜你喜欢
    • 1970-01-01
    • 2015-05-26
    • 2011-09-07
    • 2015-01-02
    • 2011-03-12
    • 2012-01-10
    • 2014-03-31
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多