Не удается создать фабрику подключений к очереди в Apache Camel

#spring-boot #apache-camel #spring-jms

#весенняя загрузка #apache-camel #spring-jms

Вопрос:

Я использую Apache Camel в своем проекте и внедряю его в приложение Spring Boot. Мое требование — прочитать сообщение от Apache Active MQ Artemis (встроенного в JBoss EAP 7.2.0) и записать сообщение на IBM MQ. Обе очереди удаленны от моего текущего сервера. Проект Spring Boot будет развернут как файл war на сервере JBoss EAP 7.2.0.

Я разработал отдельную программу, которая считывала бы сообщение из и записывала сообщение в Apache Active MQ Artemis. Я создал фабрику подключений в классе конфигурации Spring Boot. Ниже приведен мой класс конфигурации весенней загрузки и класс маршрута:

 @SpringBootApplication
@EnableJms
public class SpringMqDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringMqDemoApplication.class, args);
    }

    private static final String INITIAL_CONTEXT_FACTORY = "org.wildfly.naming.client.WildFlyInitialContextFactory";
    private static final String CONNECTION_FACTORY = "jms/RemoteConnectionFactory";

    @Bean
    public ConnectionFactory connectionFactory() {
        try {
            System.out.println("Retrieving JMS queue with JNDI name: "   CONNECTION_FACTORY);
            JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
            jndiObjectFactoryBean.setJndiName(CONNECTION_FACTORY);

            jndiObjectFactoryBean.setJndiEnvironment(getEnvProperties());
            jndiObjectFactoryBean.afterPropertiesSet();

            return (QueueConnectionFactory) jndiObjectFactoryBean.getObject();

        } catch (NamingException e) {
            System.out.println("Error while retrieving JMS queue with JNDI name: ["   CONNECTION_FACTORY   "]");
        } catch (Exception ex) {
            System.out.println("Error");
        }
        return null;
    }

    public Properties getEnvProperties() {
        Properties env = new Properties();
        env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
        env.put(Context.PROVIDER_URL, "http-remoting://<<IP>>:8080");
        env.put(Context.SECURITY_PRINCIPAL, "username");
        env.put(Context.SECURITY_CREDENTIALS, "password");
        return env;
    }

    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory) {

        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        JndiDestinationResolver jndiDestinationResolver = new JndiDestinationResolver();

        jndiDestinationResolver.setJndiEnvironment(getEnvProperties());
        factory.setDestinationResolver(jndiDestinationResolver);
        return factory;
    }

@Component
public class Route extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from("direct:producer")
            .log("Camel route")
            .to("jms:queue:queue1");
        
        from("jms:queue:queue2")
            .log("Camel route: ${body}")
            .to("someEndpoint");
    }
    
}
  

С помощью этого примера программы я смог выполнить запись в queue1 и прочитать из queue2, но здесь я использую один и тот же ConnectionFactory для обеих очередей. В моем проекте мне придется использовать две фабрики подключений, может кто-нибудь, пожалуйста, подсказать мне, как использовать две фабрики подключений для обеих очередей?

Я просмотрел документацию конечной точки JMS, но не уверен, какое значение мне следует использовать для параметра «ConnectionFactory» в конечной точке camel jms.

Комментарии:

1. Вы читали документацию Camel по компоненту JMS ? Если да, то чего не хватало? Пожалуйста, будьте конкретны.

2. Я прочитал документацию, и в ней не говорится о том, где создать фабрику соединений. В нем говорится, как мы можем использовать фабрику соединений. Я хочу знать, где будет создана фабрика подключений, чтобы использовать ее на конечной точке camel.

3. Вы читали немного о использовании JNDI для поиска фабрики соединений ? Пожалуйста, поясните, почему это у вас не сработает.

4. Я подробно объяснил свою проблему, надеюсь, это поможет понять мою точную проблему.