簡體   English   中英

ActiveMQ生產者XA交易

[英]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配置正確:

  • 它具有對有效連接工廠org.apache.activemq.ra.ActiveMQConnectionFactory的引用
  • 連接工廠對有效事務管理器的引用:org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl
  • 交易的會話設置為true
  • 會話確認模式設置為SESSION_TRANSACTED(0)

您是否知道為什么這些消息會立即被推送到隊列中,而在事務回滾時(例如,當我在“ sendMessage”方法的末尾引發異常時)不會將它們刪除?

您需要顯示其余的配置(事務管理器等)。

看來您沒有在應用程序上下文中啟用事務,因此模板正在提交事務本身。

上下文中是否有<tx:annotation-driven/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM