<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    針對Java開發者的Apache Camel入門指南

    Apache Camel是一個非常實用的規則引擎庫,能夠用來處理來自于不同源的事件和信息。你可以在使用不同的協議比如VM,HTTP,FTP,JMS甚至是文件系統中來傳遞消息,并且讓你的操作邏輯和傳遞邏輯保持分離,這能夠讓你更專注于消息的內容。

    在這篇文章中,我將提供一個Java語言(非Groovy)的Apache Camel入門演示。

    首先創建一個Maven項目的pom.xml。

    1. <?xml version="1.0" encoding="UTF-8"?> 
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" 
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    4. xsi:schemaLocation="  
    5. http://maven.apache.org/POM/4.0.0  
    6. http://maven.apache.org/maven-v4_0_0.xsd"> 
    7.  
    8. <modelVersion>4.0.0</modelVersion> 
    9. <groupId>camel-spring-demo</groupId> 
    10. <artifactId>camel-spring-demo</artifactId> 
    11. <version>1.0-SNAPSHOT</version> 
    12. <packaging>jar</packaging> 
    13.  
    14. <properties> 
    15. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    16. <camel.version>2.11.1</camel.version> 
    17. </properties> 
    18.  
    19. <dependencies> 
    20. <dependency> 
    21. <groupId>org.apache.camel</groupId> 
    22. <artifactId>camel-core</artifactId> 
    23. <version>${camel.version}</version> 
    24. </dependency> 
    25. <dependency> 
    26. <groupId>org.slf4j</groupId> 
    27. <artifactId>slf4j-simple</artifactId> 
    28. <version>1.7.5</version> 
    29. </dependency> 
    30. </dependencies> 
    31.  
    32. </project> 

    在這里我們只用到了camel-core.jar包,實際上它提供了許多你可能用到的實用組件。出于日志記錄的目的,我使用了slf4j-simple來作為日志記錄的實現,從而我們可以從控制臺上看到輸出。

    接下來我們只需要構造一個路由類。路由就好比是Camel中怎樣將消息從一端傳遞到另一端的一個指令定義。我們將會創建src/main/java /camelcoredemo/TimerRouteBuilder.java文件,每隔一秒向處理器發送一個消息,簡單打印出來。

    1. package camelcoredemo;  
    2.  
    3. import org.slf4j.*;  
    4. import org.apache.camel.*;  
    5. import org.apache.camel.builder.*;  
    6.  
    7. public class TimerRouteBuilder extends RouteBuilder {  
    8. static Logger LOG = LoggerFactory.getLogger(TimerRouteBuilder.class);  
    9. public void configure() {  
    10. from("timer://timer1?period=1000")  
    11. .process(new Processor() {  
    12. public void process(Exchange msg) {  
    13. LOG.info("Processing {}", msg);  
    14. }  
    15. });  
    16. }  

    以上就是這個示例的全部所需,現在編譯運行。

    1. bash> mvn compile  
    2. bash> mvn exec:java -Dexec.mainClass=org.apache.camel.main.Main -Dexec.args='-r camelcoredemo.TimerRouteBuilder' 

    注意,這里我們并沒有編寫Java類的main入口,我們只是將RouteBuilder的類名當作參數簡單傳遞給 org.apache.camel.main.Main,然后它將自動加載路由。

    控制CamelContext

    當啟動Camel后,它會創建一個CamelContext對象,該對象擁有了很多關于如何運行Camel的信息,還包含我們所創建的Route的定義。現在如果你想通過CamelContext獲得更多的控制,那么你需要編寫自己的主類代碼。我在這舉個簡單的例子。

    1. package camelcoredemo;  
    2.  
    3.  
    4.  
    5.  
    6. import org.slf4j.*;  
    7. import org.apache.camel.*;  
    8. import org.apache.camel.impl.*;  
    9. import org.apache.camel.builder.*;  
    10.  
    11.  
    12.  
    13.  
    14. public class TimerMain {  
    15. static Logger LOG = LoggerFactory.getLogger(TimerMain.class);  
    16. public static void main(String[] args) throws Exception {  
    17. new TimerMain().run();  
    18. }  
    19. void run() throws Exception {  
    20. final CamelContext camelContext = new DefaultCamelContext();  
    21. camelContext.addRoutes(createRouteBuilder());  
    22. camelContext.setTracing(true);  
    23. camelContext.start();  
    24.  
    25.  
    26.  
    27.  
    28. Runtime.getRuntime().addShutdownHook(new Thread() {  
    29. public void run() {  
    30. try {  
    31. camelContext.stop();  
    32. catch (Exception e) {  
    33. throw new RuntimeException(e);  
    34. }  
    35. }  
    36. });  
    37.  
    38.  
    39.  
    40.  
    41. waitForStop();  
    42. }  
    43. RouteBuilder createRouteBuilder() {  
    44. return new TimerRouteBuilder();  
    45. }  
    46. void waitForStop() {  
    47. while (true) {  
    48. try {  
    49. Thread.sleep(Long.MAX_VALUE);  
    50. catch (InterruptedException e) {  
    51. break;  
    52. }  
    53. }  
    54. }  

    可以看到,我們在createRouteBuilder()方法中重用了已有的TimerRouteBuilder類。現在我們的主類對在什么時候創建、啟動、停止CamelContext有了完全的控制。context(camelContext)對象允許你全局性地控制如何配置Camel,而不是在 Route級。它的JavaDoc鏈接給出了所有setter方法,你可以研究下它都可以做些什么。

    注意到一點,我們也需要在我們的主類中提供少量設置代碼。首先我們需要處理優雅關閉的問題,所以我們增加了一個Java關閉回調函數去調用context 的stop()方法。其次在context已經啟動后,我們需要增加一個線程阻塞。如果在啟動后你不阻塞你的主線程,那么它會在啟動后就簡單的退出了,那就沒啥用了。你會把Camel一直作為一個服務(就像一個服務器)運行,直至你按下CTRL+C鍵去終止該進程。

    改善啟動CamelContext的主類

    如果你不想像上面例子一樣過多的處理主類設置代碼,那么你可以簡單地繼承由camel-core提供的 org.apache.camel.main.Main類作為代替。通過利用這個類,你不僅可以讓你的context自動設置,還可以獲得所有附加的命令行特性,比如控制進程運行多久,啟用追蹤,加載自定義route類等等。

    重構了下上一個例子,代碼如下:

    1. package camelcoredemo;  
    2.  
    3. import org.slf4j.*;  
    4. import org.apache.camel.builder.*;  
    5. import org.apache.camel.main.Main;  
    6.  
    7. public class TimerMain2 extends Main {  
    8. static Logger LOG = LoggerFactory.getLogger(TimerMain2.class);  
    9. public static void main(String[] args) throws Exception {  
    10. TimerMain2 main = new TimerMain2();  
    11. main.enableHangupSupport();  
    12. main.addRouteBuilder(createRouteBuilder());  
    13. main.run(args);  
    14. }  
    15. static RouteBuilder createRouteBuilder() {  
    16. return new TimerRouteBuilder();  
    17. }  

    現在TimerMain2類的代碼比之前的更少了,你可以試試看,它應該和之前的功能一樣。

    1. bash> mvn compile  
    2. bash> mvn exec:java -Dexec.mainClass=camelcoredemo.TimerMain2 -Dexec.args='-t' 

    注意到我們給出-t選項后,會轉儲Route追蹤。使用-h會看到所有可用的選項。

    用Camel的注冊機制添加bean

    在之前的TimerRouteBuilder例子中,我們已經在代碼中創建了一個匿名Processor。現在如果你想將幾個不同的Processor放在一起,那么使用Camel的注冊機制添加bean的方式將能更好的減少代碼混亂。Camel允許你通過將processing當作bean注入到它的 registry space,然后你只要把它們當作bean組件來進行調用。如下是我的重構代碼:

    1. package camelcoredemo;  
    2.  
    3. import org.slf4j.*;  
    4. import org.apache.camel.*;  
    5. import org.apache.camel.builder.*;  
    6. import org.apache.camel.main.Main;  
    7.  
    8. public class TimerBeansMain extends Main {  
    9. static Logger LOG = LoggerFactory.getLogger(TimerBeansMain.class);  
    10. public static void main(String[] args) throws Exception {  
    11. TimerBeansMain main = new TimerBeansMain();  
    12. main.enableHangupSupport();  
    13. main.bind("processByBean1"new Bean1());  
    14. main.bind("processAgainByBean2"new Bean2());  
    15. main.addRouteBuilder(createRouteBuilder());  
    16. main.run(args);  
    17. }  
    18. static RouteBuilder createRouteBuilder() {  
    19. return new RouteBuilder() {  
    20. public void configure() {  
    21. from("timer://timer1?period=1000")  
    22. .to("bean:processByBean1")  
    23. .to("bean:processAgainByBean2");  
    24. }  
    25. };  
    26. }  
    27.  
    28. // Processor beans  
    29. static class Bean1 implements Processor {  
    30. public void process(Exchange msg) {  
    31. LOG.info("First process {}", msg);  
    32. }  
    33. }  
    34. static class Bean2 implements Processor {  
    35. public void process(Exchange msg) {  
    36. LOG.info("Second process {}", msg);  
    37. }  
    38. }  

    現在Route類更簡潔明了,同時處理代碼也被重構到了獨立的類中。當你需要編寫很復雜的Route來實現業務邏輯時,這種方式能夠幫助你更好的組織和測試你的代碼。它能夠讓你構建像”樂高“積木那樣可復用的POJO bean。Camel的registry space同樣可用于其他很多用途,比如你可以自定義許多具有附加功能的endpoint組件或者注冊一些信息,更或者替換線程池實現策略之內的事情。

    上述Route示例是用所謂的Java DSL來構成的,它的可讀性較高,你可以用IDE提供的支持查看所有可用于Route的方法。

    我希望這篇文章能夠幫助你跳過Camel的摸索階段。除了已經提到的事件組件之外,camel還提供了如下組件:

    Have fun!

    英文原文:Getting Started with Apache Camel using Java

    譯文鏈接:http://www.oschina.net/translate/getting-started-with-apache-camel-using

    posted on 2014-06-05 14:00 paulwong 閱讀(4861) 評論(0)  編輯  收藏 所屬分類: CAMEL


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国产亚洲人成在线播放| 久久精品免费观看| 国产免费一区二区三区| 亚洲精品无码mv在线观看网站| 色天使色婷婷在线影院亚洲| 国产中文字幕免费| 亚洲av无码专区青青草原| 在线视频观看免费视频18| 成人免费视频一区| 亚洲日韩小电影在线观看| 久久精品国产亚洲麻豆| a级毛片黄免费a级毛片| 亚洲AV人人澡人人爽人人夜夜| 亚洲人成网站在线观看播放青青| 久久久久久亚洲Av无码精品专口| 亚洲久悠悠色悠在线播放| 国产啪精品视频网免费| 亚洲午夜福利在线视频| 亚洲日韩精品无码AV海量| 精品视频在线免费观看| 毛片免费视频观看| 日韩国产精品亚洲а∨天堂免| 成在线人免费无码高潮喷水| 性色av免费观看| 日韩在线观看免费完整版视频| 国产免费阿v精品视频网址| 亚洲成人精品久久| 亚洲熟女www一区二区三区| 国产精品jizz在线观看免费| 国产免费一区二区三区免费视频| 免费又黄又爽又猛的毛片| 一级做a爰片久久毛片免费看| 国产麻豆视频免费观看| 日本免费人成黄页在线观看视频 | 亚洲综合精品一二三区在线| 国产亚洲人成在线影院| 国产亚洲综合色就色| 西西大胆无码视频免费| 一二三四在线观看免费中文在线观看| 99热在线免费观看| 黄床大片30分钟免费看|