首页 文章

activeMQ不参与Weblogic XA事务

提问于
浏览
1

我尝试使用部署到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")

有什么我想念的吗?

2 回答

相关问题