簡體   English   中英

activeMQ不參與Weblogic XA事務

[英]activeMQ does not participate in Weblogic XA transactions

我嘗試獲取涉及在部署到Weblogic的Spring webapp中工作的jdbc和jms DataSource的XA事務。

使用本地的Atomikos TransactionManager,此方法有效-我在ActiveMQ中看到XA調試消息,並且內容保持一致。 但是,在Weblogic中,數據庫和ActiveMQ在事務上不一致。

我在Weblogic中添加了外部JMS服務器

JNDI初始上下文工廠:

org.apache.activemq.jndi.ActiveMQInitialContextFactory

JNDI連接URL:

tcp://localhost:61616

JNDI屬性:

connectionFactoryNames=XAConnectionFactory

向該服務器添加了一個ConnectionFactory(遠程JNDI名稱= XAConnectionFactory)。 查找工作正常,到目前為止效果很好。

在我的代碼中,這就是設置Spring JTA的方式:

@Override
   @Bean
   @Profile(AppConfig.PROFILE_WEBLOGIC)
   public JtaTransactionManager transactionManager()
   {
      WebLogicJtaTransactionManager tx = new WebLogicJtaTransactionManager();
      tx.afterPropertiesSet();

      return tx;
   }

這是我的JMS配置:

   @Bean
   @Profile(AppConfig.PROFILE_WEBLOGIC)
   public ConnectionFactory connectionFactory()
   {
      Properties props = new Properties();
      props.put(Context.INITIAL_CONTEXT_FACTORY, env.getProperty(Context.INITIAL_CONTEXT_FACTORY));
      props.setProperty(Context.PROVIDER_URL, env.getProperty(Context.PROVIDER_URL));

      try
      {
         InitialContext ctx = new InitialContext(props);
         ActiveMQXAConnectionFactory connectionFactory = (ActiveMQXAConnectionFactory) ctx
            .lookup(env.getProperty("jms.connectionFactory"));

         return connectionFactory;
      }
      catch(NamingException e)
      {
         throw new RuntimeException("XAConnectionFactory lookup failed", e);
      }
   }

   @Bean
   public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() throws JMSException
   {
      DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
      factory.setConnectionFactory(connectionFactory());
      factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
      factory.setTransactionManager(txConfig.transactionManager());
      factory.setBackOff(new FixedBackOff());

      return factory;
   }

   @Bean(name = "jmsTemplate")
   @Override
   public JmsTemplate jmsTemplate() throws JMSException
   {
      JmsTemplate t = new JmsTemplate();
      t.setConnectionFactory(connectionFactory());
      t.setMessageTimestampEnabled(true);
      t.setMessageIdEnabled(true);

      return t;
   }

我的JMS使用者使用以下注釋:

@Transactional   
@JmsListener(destination = "test.q1")

我有什么想念的嗎?

事實證明,這只能通過資源適配器來實現,而不能僅通過JNDI ConnectionFactory來實現。

可以使用外部JMS服務器定義中未記錄的ActiveMQ JNDI屬性“ xa = true”,請參見此處:

暫無
暫無

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

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