Русский English Тэги View Sergey Zolotaryov's profile on LinkedIn Вход
Как соединить Tibco EMS и Apache Karaf
Постоянная ссылка 04-06-2018 anydoby java

Недавно понадобилось писать JMS сообщения в Tibco EMS (business works) из OSGi контейнера Apache Karaf. По идее задача тривиальная, если использовать Spring или JEE: просим ресурс ConnectionFactory из JNDI устанавливаем соединение и шлём. Однако, когда дошло до Karaf, всё пошло не так.

Первая попытка была просто использовать Spring annotated configuration. Фейл, так как спринг использует плоский класслоадер, а в OSGi всё намного сложнее и контекст не завёлся. Что ж, теперь попробуем создать контекст программно, как-то так:


InitialContext ic = new InitialContext();
......
ConnectionFactory cf = ic.lookup("myTibcoContextFactory");
......

Из юнит теста это работало, получался правильный TibjmsFederatedConnectionFactory, однако, каково же было моё удивление, когда в Karaf на выходе в cf получался объект типа TibjmsConnectionFactoryAttributes. Короче JNDI в карафе тоже не работает нормально.

Пришлось делать всё программно, вот как-то так:


package com.test;

import com.tibco.tibjms.naming.TibjmsFederatedQueueConnectionFactory;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Instantiate;
import org.apache.felix.ipojo.annotations.Provides;
import org.apache.felix.ipojo.annotations.ServiceProperty;
import org.apache.felix.ipojo.annotations.Updated;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jms.connection.CachingConnectionFactory;
import org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import java.security.cert.Certificate;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Stream;


/**
 * @author anydoby
 */
@Component(immediate = true, managedservice = "ems")
@Instantiate
@Provides
public class TibcoEMSConfig {

    private static final Logger LOG = LoggerFactory.getLogger(TibcoEMSConfig.class);
    
    private CachingConnectionFactory connection;

    @ServiceProperty(name = "ems.url")
    private String emsUrl;
    @ServiceProperty(name = "ems.user")
    private String emsUser;
    @ServiceProperty(name = "ems.password")
    private String emsPassword;
 
    @Updated
    public void updated() {
        LOG.info("Updated " + this.getClass().getSimpleName());
    }

    @Override
    public Connection jms() throws Exception {
        return connectionFactory().createConnection();
    }

    private ConnectionFactory connectionFactory() throws Exception {
        if(connection == null) {
            LOG.debug("Generating connection factory");
            TibjmsFederatedQueueConnectionFactory connectionFactory = new TibjmsFederatedQueueConnectionFactory();
            connectionFactory.setServerUrl(emsUrl);
            LOG.debug("Retrieving certificates");
            Certificate caCert = // get your company's root certificate here;
            connectionFactory.setSSLTrustedCertificate(caCert.getEncoded(), "company_ca");
            LOG.debug("Generated connection factory");

            UserCredentialsConnectionFactoryAdapter authenticate = new UserCredentialsConnectionFactoryAdapter();
            authenticate.setTargetConnectionFactory(connectionFactory);
            authenticate.setUsername(emsUser);
            authenticate.setPassword(emsPassword);

            CachingConnectionFactory factory = new CachingConnectionFactory(authenticate);
            factory.setReconnectOnException(true);
            factory.setCacheConsumers(true);
            factory.setCacheProducers(true);
            connection = factory;
        }
        return connection;
    }

}

По ходу разбирательства оказалось, что тибка не умеет сертификаты стандартным способом из keystore, так что пришлось их загружать самому и всовывать через не сильно документированный API.

Добавить комментарий

Предыдущая статья Конфигурация SSL в Camel - централизовано Следующая статья Удобный шаблон для итерирования по спискам в Eclipse