私のチームが現在取り組んでいるスタンドアロンのSpring(4.3.2)アプリケーションから接続しようとしているApache ActiveMQ Artemis(1.3)インスタンスがあります。これは、プロバイダとしてAtomikos(4.0.4)UserTransactionManagerを使用しているSpring JTATransactionManagerを持っています。これらのトランザクションでは、前述のMQを含むいくつかのリソースに接続する必要があります。アルテミスとアトミコスのマニュアルに続いて、ActiveMQConnectionFactoryを設定し、に渡すと、AtomikosConnectionFactoryBeanになります。それはすべてSpringコンテナで起こりますが、それは私たちの問題に関係していないようです。ActiveMQConnectionFactoryから認証されたXAリソースを作成する
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がオーバーロードされたバージョンをそのコードを見て呼び出す可能性は見当たりません。
public class ActiveMQConnectionFactoryWrapper implements XAConnectionFactory {
private final ActiveMQConnectionFactory factory;
public ActiveMQConnectionFactoryWrapper(ActiveMQConnectionFactory factory) {
this.factory = factory;
}
@Override
public XAConnection createXAConnection() throws JMSException {
return factory.createXAConnection(factory.getUser(), factory.getPassword());
}
@Override
public XAConnection createXAConnection(String userName, String password) throws JMSException {
return factory.createXAConnection(userName, password);
}
@Override
public XAJMSContext createXAContext() {
return factory.createXAContext(factory.getUser(), factory.getPassword());
}
@Override
public XAJMSContext createXAContext(String userName, String password) {
return factory.createXAContext(userName, password);
}
}
その他のインタフェースが必要な場合は、同様に実装することができます。
よろしく、 ヤクブ回避策として