0

У меня есть экземпляр Apache ActiveMQ Artemis (1.3), к которому я пытаюсь подключиться из автономного приложения Spring (4.3.2), над которым работает моя команда. У этого есть Весна JTATransactionManager с использованием Atomikos (4.0.4) UserTransactionManager как поставщик, и во время этих транзакций мне нужно подключиться к нескольким ресурсам, включая вышеупомянутый MQ. Следуя инструкциям Artemis и Atomikos, мы установили ActiveMQConnectionFactory, который затем передается в AtomikosConnectionFactoryBean. Все это происходит в контейнере Spring, но это, похоже, не связано с нашей проблемой.Создание аутентифицированного ресурса XA из ActiveMQConnectionFactory

Все работало хорошо, пока я не попытался добавить аутентификацию в соединение 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? Я не вижу возможности Atomicos вызывать перегруженную версию, глядя на ее код.

С уважением, Якуб

ответ

0

В качестве временного решения, мы решили обернуть ActiveMQConnectionFactory в классе реализации необходимого интерфейса:

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); 
    } 
} 

Другие интерфейсы могут быть реализованы, а также, если потребности быть.