2015-01-21 114 views
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」方法的末尾拋出異常時?

回答

1

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

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

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

+0

是的,我有和mode被設置爲「proxy」。我發現交易攔截器沒有出現在堆棧跟蹤中。然後我意識到@Transactional方法並沒有通過接口調用,所以spring-aop沒有添加事務攔截器(spring-aop的非常常見的限制)。當我確定一切正常。謝謝你的線索! – Konrad 2015-01-21 16:47:20

相關問題