Как перехватить исключение BeanCreationException при инициализации маршрута Apache Camel, чтобы в любом случае запустить приложение Spring?
Я использую Apache Camel, и я определил маршрут, получая входные данные из 2 очередей, расположенных на 2 разных серверах. В идеале я хочу использовать оба сервера, но я также хочу иметь возможность запускать приложение, когда один из 2 пунктов назначения не работает.
Вот мой маршрут:
try {
from("mccdsJmsRequest1:queue:{{mccds.queues.in}}").to("direct:apolloMccdsRoute");
} catch (Exception e){
// debug line
System.out.println("Ms1 not reachable");
e.printStackTrace();
}
try {
from("mccdsJmsRequest2:queue:{{mccds.queues.in}}").to("direct:apolloMccdsRoute");
} catch (Exception e){
// debug line
System.out.println("Ms2 not reachable");
e.printStackTrace();
}
from("direct:apolloMccdsRoute").routeId("apolloMCCDSRoute")
// Main route starts here...
Я объявляю мои бобы здесь:
@Bean
public JndiObjectFactoryBean mccdsJmsConnectionFactory1() {
JndiObjectFactoryBean cf = new JndiObjectFactoryBean();
cf.setJndiEnvironment(prodMccdsJndiProperties.getJndi1());
cf.setJndiName(jndiName1);
return cf;
}
@Bean
public JndiObjectFactoryBean mccdsJmsConnectionFactory2(){
JndiObjectFactoryBean cf = new JndiObjectFactoryBean();
cf.setJndiEnvironment(prodMccdsJndiProperties.getJndi2());
cf.setJndiName(jndiName2);
return cf;
}
@Inject
private CamelContext camelContext;
@Bean
public JmsComponent mccdsJmsRequest1() {
JmsComponent ac = new JmsComponent(camelContext);
ac.setConnectionFactory((ConnectionFactory) mccdsJmsConnectionFactory1().getObject());
ac.setConcurrentConsumers(5);
return ac;
}
@Bean
public JmsComponent mccdsJmsRequest2(){
JmsComponent ac = new JmsComponent(camelContext);
ac.setConnectionFactory((ConnectionFactory) mccdsJmsConnectionFactory2().getObject());
ac.setConcurrentConsumers(5);
return ac;
}
Если один из заводов соединений недоступен, приложение не запускается. Я хотел бы поймать игнорировать исключение:
o.s.b.f.s.DefaultListableBeanFactory : Bean creation exception on non-lazy FactoryBean type check: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mccdsJmsConnectionFactory2' defined in class path resource [ca/bell/it/spa/uim/apollo/maximo/config/mccds/ProdMccdsJmsConfiguration.class]: Invocation of init method failed; nested exception is javax.naming.CommunicationException [Root exception is java.net.ConnectException: t3://someTestServerIP: Destination unreachable; nested exception is:
java.net.ConnectException: Connection refused (Connection refused); No available router to destination]
2 ответа
Попробуйте установить lookupOnStartup
ложно. (Добавлять cf.setLookupOnStartup(false)
к mccdsJmsConnectionFactory1
а также mccdsJmsConnectionFactory2
бин определения.)
Также проверьте эту тему: http://forum.spring.io/forum/spring-projects/batch/95620-jndi-lookup
Это не сработает, потому что ваши блоки try / catch никогда не выполняются во время выполнения вашего маршрута. В вашем коде вы получите исключение только во время первоначального выполнения этого кода Camel при запуске приложения, когда он строит маршрут, когда ему все равно, существуют ли ваши очереди или нет.
Вместо этого вам нужно определить, когда в вашем маршруте возникает ошибка, когда она выполняется после создания. Есть несколько способов сделать это, но хорошим началом может стать рассмотрение Исключительной оговорки Camel.
И альтернативный и, возможно, даже лучший выбор - использовать балансировщик нагрузки Camel. Это позволяет вам пробовать любое количество конечных точек и переходить к следующему при сбое с исключением.