2015-08-28 47 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。