2017-07-28 40 views
0

我使用的是Apache Camel,我定义了一个路由接收来自位于2个不同服务器上的2个队列的输入。我希望理想地从两台服务器上使用,但我也希望能够在两个目的地之一关闭时运行该应用程序。如何在Apache Camel路由初始化中捕获BeanCreationException以允许我的Spring应用程序启动?

这里是我的路线:

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] 

回答

0

尝试将lookupOnStartup设置为false。 (添加cf.setLookupOnStartup(false)mccdsJmsConnectionFactory1mccdsJmsConnectionFactory2 bean定义。)

还要检查这个线程:http://forum.spring.io/forum/spring-projects/batch/95620-jndi-lookup

+1

这工作。我不得不添加cf.setProxyInterface(javax.jms.ConnectionFactory.class);或者setLookuponStartup(false)是不允许的。谢谢! – Alex

0

,因为你的try/catch块从不路线的执行期间,执行这是行不通的。在您的代码中,只有在应用程序启动时,在Camel执行此代码时,您只会在构建路由时才会收到异常,而不管您的队列是否存在。

取而代之,您需要确定在执行之后,当您的路由发生错误时正在构建之后。有很多方法可以做到这一点,但一个好的开始可能是看骆驼的Exception Clause

而替代的或许更好的选择是利用骆驼的Load Balancer。它允许您尝试任意数量的端点,并在发生异常时失败转移到下一个端点。

相关问题