Camel自定义组件示例

来源:互联网 发布:emf文件打开软件 编辑:程序博客网 时间:2024/05/05 01:21
要想在Camel中自定义组件,就要对Camel中关键概念进行理解,了解Camel中路由的构建过程与启动过程,在前面的文章中已经有相关的叙述。

这里就给出一个自定义组件的例子。该例子还是以文件轮询为主题,下面是具体代码。

组件类:

[java] view plaincopy
  1. package com.xtayfjpk.esb.components.file;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import org.apache.camel.Endpoint;  
  6. import org.apache.camel.impl.DefaultComponent;  
  7.   
  8. public class MyFileComponent extends DefaultComponent {  
  9.   
  10.     @Override  
  11.     protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {  
  12.         return new MyFileEndpoint(this, uri);  
  13.     }  
  14.   
  15. }  

Endpoint类:

[java] view plaincopy
  1. package com.xtayfjpk.esb.components.file;  
  2.   
  3. import java.io.File;  
  4.   
  5. import org.apache.camel.Consumer;  
  6. import org.apache.camel.Exchange;  
  7. import org.apache.camel.Processor;  
  8. import org.apache.camel.Producer;  
  9. import org.apache.camel.component.file.FileComponent;  
  10. import org.apache.camel.impl.DefaultEndpoint;  
  11. import org.apache.camel.impl.DefaultExchange;  
  12.   
  13. public class MyFileEndpoint extends DefaultEndpoint {  
  14.   
  15.     public MyFileEndpoint(MyFileComponent component, String uri) {  
  16.         super(uri, component);  
  17.     }  
  18.   
  19.     @Override  
  20.     public Producer createProducer() throws Exception {  
  21.         return new MyFileProducer(this);  
  22.     }  
  23.   
  24.     @Override  
  25.     public Consumer createConsumer(Processor processor) throws Exception {  
  26.         return new MyFileConsumer(this, processor);  
  27.     }  
  28.   
  29.     @Override  
  30.     public boolean isSingleton() {  
  31.         return false;  
  32.     }  
  33.       
  34.     public Exchange createExchange(File file) {  
  35.         Exchange exchange = new DefaultExchange(getCamelContext());  
  36.         exchange.setProperty(FileComponent.FILE_EXCHANGE_FILE, file);  
  37.         exchange.getIn().setBody(file, File.class);  
  38.         return exchange;  
  39.     }  
  40. }  

Consumer类:

[java] view plaincopy
  1. package com.xtayfjpk.esb.components.file;  
  2.   
  3. import java.io.File;  
  4. import java.util.concurrent.Executors;  
  5. import java.util.concurrent.ScheduledExecutorService;  
  6. import java.util.concurrent.TimeUnit;  
  7.   
  8. import org.apache.camel.Endpoint;  
  9. import org.apache.camel.Exchange;  
  10. import org.apache.camel.Processor;  
  11. import org.apache.camel.impl.DefaultConsumer;  
  12.   
  13. public class MyFileConsumer extends DefaultConsumer implements Runnable {  
  14.     private ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);  
  15.     private File pollDir;  
  16.       
  17.     public MyFileConsumer(Endpoint endpoint, Processor processor) {  
  18.         super(endpoint, processor);  
  19.           
  20.         String pollDir = endpoint.getEndpointUri().substring(endpoint.getEndpointUri().indexOf(":")+1);  
  21.         this.pollDir = new File(pollDir);  
  22.     }  
  23.       
  24.       
  25.     @Override  
  26.     protected void doStart() throws Exception {  
  27.         super.doStart();  
  28.           
  29.         executorService.scheduleAtFixedRate(this, 1000L, 1000L, TimeUnit.MILLISECONDS);  
  30.           
  31.     }  
  32.   
  33.   
  34.     @Override  
  35.     public void run() {  
  36.         File[] files = pollDir.listFiles();  
  37.         for(File file : files) {  
  38.             MyFileEndpoint endpoint = (MyFileEndpoint) getEndpoint();  
  39.             Exchange exchange = endpoint.createExchange(file);  
  40.             try {  
  41.                 processExchange(exchange);  
  42.             } catch (Exception e) {  
  43.                 e.printStackTrace();  
  44.             }  
  45.         }  
  46.           
  47.     }  
  48.   
  49.   
  50.     private void processExchange(Exchange exchange) throws Exception {  
  51.         this.getProcessor().process(exchange);  
  52.     }  
  53.   
  54. }  

Producer类:

[java] view plaincopy
  1. package com.xtayfjpk.esb.components.file;  
  2.   
  3. import java.io.File;  
  4.   
  5. import org.apache.camel.Endpoint;  
  6. import org.apache.camel.Exchange;  
  7. import org.apache.camel.impl.DefaultProducer;  
  8. import org.apache.commons.io.FileUtils;  
  9.   
  10. public class MyFileProducer extends DefaultProducer {  
  11.     private File outputDir;  
  12.   
  13.     public MyFileProducer(Endpoint endpoint) {  
  14.         super(endpoint);  
  15.           
  16.         this.outputDir = new File(endpoint.getEndpointUri().substring(endpoint.getEndpointUri().indexOf(":")+1));  
  17.     }  
  18.   
  19.     @Override  
  20.     public void process(Exchange exchange) throws Exception {  
  21.         File file = exchange.getIn().getBody(File.class);  
  22.         if(file!=null) {  
  23.             FileUtils.moveFileToDirectory(file, outputDir, true);  
  24.         }  
  25.     }  
  26.   
  27. }  

测试类:

[java] view plaincopy
  1. package com.xtayfjpk.esb.components.file;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.FileInputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.io.PrintStream;  
  8.   
  9. import org.apache.camel.CamelContext;  
  10. import org.apache.camel.Exchange;  
  11. import org.apache.camel.Processor;  
  12. import org.apache.camel.builder.RouteBuilder;  
  13. import org.apache.camel.impl.DefaultCamelContext;  
  14.   
  15. public class MyComponentTest {  
  16.   
  17.     /** 
  18.      * @param args 
  19.      * @throws Exception  
  20.      */  
  21.     public static void main(String[] args) throws Exception {  
  22.         CamelContext camelContext = new DefaultCamelContext();  
  23.         //为了简单起见,用该方法替代了在类路径META-INF/services/org/apache/camel/component/下放置properties文件方式  
  24.         camelContext.addComponent("myfile"new MyFileComponent());  
  25.   
  26.         camelContext.addRoutes(new RouteBuilder() {  
  27.               
  28.             @Override  
  29.             public void configure() throws Exception {  
  30.                 this.from("myfile:H:/temp/in").process(new Processor() {  
  31.                     @Override  
  32.                     public void process(Exchange exchange) throws Exception {  
  33.                         File file = exchange.getIn().getBody(File.class);  
  34.                         PrintStream ps = new PrintStream(System.out);  
  35.                         BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));  
  36.                         String line = null;  
  37.                         while((line=br.readLine())!=null) {  
  38.                             ps.println(line);  
  39.                         }  
  40.                           
  41.                         ps.close();  
  42.                         br.close();  
  43.                     }  
  44.                 }).to("myfile:H:/temp/out");  
  45.                   
  46.             }  
  47.         });  
  48.           
  49.         camelContext.start();  
  50.           
  51.         Object object = new Object();  
  52.         synchronized (object) {  
  53.             object.wait();  
  54.         }  
  55.     }  
  56.   
  57. }  


如果一个组件是一个起始组件,或称为源组件,那么对应的Endpoint就必须要能创建出一个Consumer对象,如果这个组件还想是目的组件,那么对应的Endpoint还必须能创建出Producer对象。Consumer负责Exchange对象的产生,而Producer负责将Exchange对象中的消费。当然在真实应该中组件不可能写得如此简单,但大致流程是一样的,在这个例子中已经能够简单实现轮询出组件并搬运至指定目录了。

ref:http://blog.csdn.net/xtayfjpk/article/details/39122349

0 0