我有一个 Apache ActiveMQ Artemis (1.3) 实例,我正在尝试从我的团队目前正在开发的独立 Spring (4.3.2) 应用程序连接到该实例。它具有使用 Atomikos (4.0.4) UserTransactionManager作为提供者的 Spring JTATransactionManager,在这些事务中我需要连接到多个资源,包括上述 MQ。按照 Artemis 和 Atomikos 手册,我们设置了ActiveMQConnectionFactory,然后将其传递给AtomikosConnectionFactoryBean。这一切都发生在一个 Spring 容器中,但这似乎与我们的问题无关。
在我尝试向 MQ 连接添加身份验证之前,一切都运行良好。可以在ActiveMQConnectionFactory的实例上设置用户和密码属性,但是,它们似乎仅在创建普通连接时才考虑在内:
@Override
public Connection createConnection() throws JMSException {
return createConnection(user, password);
}
@Override
public Connection createConnection(final String username, final String password) throws JMSException {
return createConnectionInternal(username, password, false, ActiveMQConnection.TYPE_GENERIC_CONNECTION);
}
Atomikos 正在调用createXAConnection () 方法(来自XAConnectionFactory接口),正如我在其实现中看到的那样,除非明确传递,否则忽略凭据:
@Override
public XAConnection createXAConnection() throws JMSException {
return createXAConnection(null, null);
}
@Override
public XAConnection createXAConnection(final String username, final String password) throws JMSException {
return (XAConnection) createConnectionInternal(username, password, true, ActiveMQConnection.TYPE_GENERIC_CONNECTION);
}
这也是此类中其他一些方法的工作方式,因此我认为这不是错误。如果是这样,我应该如何获得经过身份验证的XAConnection?我看不到 Atomikos 调用重载版本的可能性,查看它的代码。
问候, 雅库布