camel 路由跳转组件使用

常用的是以下组件,并且一下组件是可以做消费者的同时还可以作为生成者

一、vm 

首先这个组件是异步并且是跨camelContext的,使用方式如下:

 from("vm:bar?concurrentConsumers=5")
注意以上的使用方式带有一个   concurrentConsumers=5 的参数,这个参数非常重要,建议使用这个组件的时候,都记得设置,这是应为vm的生成者和消费者并不是在同个线程内的,他们的通讯中间隔了一个BlockingQueue也就是消费者是从这个blockingQueue中取消息消费的,concurrentConsumers=5的意思是有5个线程准备着可以同时消费,如果不设置的话,当同时访问量高一点并且消费处理时间久,很容易出现大量的一下错误:

org.apache.camel.ExchangeTimedOutException: The OUT message was not received within: 30000 millis. Exchange[HttpMessage@0x630b92a6]
        at org.apache.camel.component.seda.SedaProducer.process(SedaProducer.java:144)[169:org.apache.camel.camel-core:2.15.2]
        at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:129)[169:org.apache.camel.camel-core:2.15.2]
        at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)[169:org.apache.camel.camel-core:2.15.2]
        at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)[169:org.apache.camel.camel-core:2.15.2]
        at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)[169:org.apache.camel.camel-core:2.15.2]
        at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)[169:org.apache.camel.camel-core:2.15.2]
        at org.apache.camel.component.jetty.CamelContinuationServlet.service(CamelContinuationServlet.java:162)[344:org.apache.camel.camel-jetty-common:2.15.2]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)[96:org.apache.geronimo.specs.geronimo-servlet_3.0_spec:1.0.0]
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)[101:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v20150415]
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496)[101:org.eclipse.jetty.aggregate.jetty-all-server:8.1.17.v2015

就是说一个线程已经处理不过来了,所以要设置 concurrentConsumers参数,所以这里建议如果没有异步要求,可以直接使用direct-vm这个组件,就不会出现以上错误。

好了,当我们配置好的时候,发现,to到这个vm的时候,并没有出现异步的作用,我们还是要等待vm处理完才继续能往下面的路由跑,例如:

		
		   
		   
		   
		

所以我们要在vm那里设置一个参数 waitForTaskToComplete=Never 这样就有异步的效果

waitForTaskToComplete=Never"/>

详细参数可以参考官网:
http://camel.apache.org/seda.html

二、direct-vm

这个组件是我们目前比较常用,同步且跨camelContext,就是说消费者与生产者中间没有隔了个 blockingQueue,是在同一线程中

三、seda

这个组件是异步不跨camelContext的,用法与vm一样

四、direct

这个是同步且不跨 camelContext的

你可能感兴趣的:(camel)