#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. Я подробно объяснил свою проблему, надеюсь, это поможет понять мою точную проблему.