【问题标题】:activeMQ does not participate in Weblogic XA transactionsactiveMQ 不参​​与 Weblogic XA 事务
【发布时间】:2016-03-10 20:52:16
【问题描述】:

我尝试在部署到 Weblogic 的 Spring webapp 中获取涉及 jdbc 和 jms 数据源的 XA 事务。

使用本地 Atomikos TransactionManager,这是可行的 - 我在 ActiveMQ 中看到 XA 调试消息,并且内容保持一致。然而,在 Weblogic 中,数据库和 ActiveMQ 在事务上不一致。

我在 Weblogic 中添加了一个外部 JMS 服务器

JNDI 初始上下文工厂:

org.apache.activemq.jndi.ActiveMQInitialContextFactory

JNDI 连接网址:

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")

我有什么遗漏吗?

【问题讨论】:

    标签: jms weblogic activemq spring-jms


    【解决方案1】:

    事实证明,这只能通过资源适配器工作,而不能单独通过 JNDI ConnectionFactory。

    【讨论】:

      【解决方案2】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-26
        • 2014-04-30
        • 2011-09-07
        • 2014-03-31
        • 2015-06-07
        • 2015-10-01
        • 1970-01-01
        相关资源
        最近更新 更多