2015-08-28 90 views
1

我尝试获取涉及jdbc和jms DataSource在部署到Weblogic的Spring webapp中工作的XA事务。activeMQ不参与Weblogic XA事务

使用本地Atomikos TransactionManager,这个工程 - 我看到ActiveAQ中的XA调试消息,并且东西保持一致。然而,在Weblogic中,数据库和ActiveMQ在事务上并不一致。

org.apache.activemq.jndi.ActiveMQInitialContextFactory 

JNDI连接URL:

tcp://localhost:61616 

JNDI属性:

connectionFactoryNames=XAConnectionFactory 

我在Weblogic的

JNDI初始上下文工厂增加了一个外部JMS服务器对于该服务器,我添加了一个ConnectionFactory(远程JNDI名称= XAConnectionFactory)。查找工作,迄今为止非常好。

在我的代码,这是我怎么设置的春天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") 

有什么我失踪?

回答

0

原来,这只能通过资源适配器来工作,它不可能仅仅通过JNDI ConnectionFactory。