我嘗試獲取涉及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")
有什麼我失蹤?