使用Java的Apache Camel入门
Apache Camel是一個非常有用的庫,可以幫助您處理來自許多不同來源的事件或消息。 您可以通過許多不同的協議(例如在VM,HTTP,FTP,JMS甚至DIRECTORY / FILE之間)移動這些消息,但仍使處理代碼不受傳輸邏輯的影響。 這樣,您就可以專注于摘要消息的內容。
在這里,我將提供一個教程,介紹如何使用Java而不是Groovy來開始使用Apache Camel。
讓我們首先創建一個Maven項目pom.xml文件。
我們將僅探索camel-core ,它實際上包含許多您可能會使用的有用組件。 同樣出于記錄目的,我添加了一個slf4j-simple作為記錄器實現,因此我們可能會在控制臺上看到輸出。
接下來,您只需要一個類即可構造Route 。 Route就像是對駱駝的指令定義,關于如何將消息從一個點移動到另一個點。 我們將創建src/main/java/camelcoredemo/TimerRouteBuilder.java文件,該文件將src/main/java/camelcoredemo/TimerRouteBuilder.java生成一次計時器消息,然后傳遞給僅對其進行記錄的處理器。
package camelcoredemo;import org.slf4j.*; import org.apache.camel.*; import org.apache.camel.builder.*;public class TimerRouteBuilder extends RouteBuilder {static Logger LOG = LoggerFactory.getLogger(TimerRouteBuilder.class);public void configure() {from("timer://timer1?period=1000").process(new Processor() {public void process(Exchange msg) {LOG.info("Processing {}", msg);}});} }這就是您開始所需要的。 現在您可以構建并運行這個簡單的演示。
bash> mvn compile bash> mvn exec:java -Dexec.mainClass=org.apache.camel.main.Main -Dexec.args='-r camelcoredemo.TimerRouteBuilder'請注意,我們甚至沒有編寫Java 主類,而只是使用org.apache.camel.main.Main選項來接受RouteBuilder類名作為參數。 然后它將自動加載并創建路線。
控制
啟動Camel時,它將創建一個CamelContext對象,該對象包含有關如何運行它的許多信息,包括我們創建的Route的定義。 現在,如果您想對此CamelContext進行更多控制,則需要編寫自己的Main類。 我會在這里給你看一個簡單的例子。
package camelcoredemo;import org.slf4j.*; import org.apache.camel.*; import org.apache.camel.impl.*; import org.apache.camel.builder.*;public class TimerMain {static Logger LOG = LoggerFactory.getLogger(TimerMain.class);public static void main(String[] args) throws Exception {new TimerMain().run();}void run() throws Exception {final CamelContext camelContext = new DefaultCamelContext();camelContext.addRoutes(createRouteBuilder());camelContext.setTracing(true);camelContext.start();Runtime.getRuntime().addShutdownHook(new Thread() {public void run() {try {camelContext.stop();} catch (Exception e) {throw new RuntimeException(e);}}});waitForStop();}RouteBuilder createRouteBuilder() {return new TimerRouteBuilder();}void waitForStop() {while (true) {try {Thread.sleep(Long.MAX_VALUE);} catch (InterruptedException e) {break;}}} }如您所見,我們在createRouteBuilder()方法中重新使用了現有的TimerRouteBuilder類。 現在,我們的Main類可以完全控制何時創建,啟動和停止CamelContext 。 此上下文使您可以控制如何全局配置駱駝,而不是在Route級別。 javadoc鏈接提供了您可以探索的所有setter方法。
注意,我們還需要在Main類中提供一些設置代碼。 首先,我們需要處理正常關閉,因此我們添加了一個Java關閉掛鉤來調用上下文stop() 。 其次,我們需要在上下文啟動后添加一個線程塊。 原因是CamelContext#start()方法是非阻塞的! 如果您在啟動后沒有阻塞Main線程,那么它將僅在它之后立即退出,這將沒有太大用處。 您想要將Camel作為服務(例如服務器)運行,直到您明確按CTRL+C終止該過程為止。
改進
如果您不想處理上面的許多Main類設置代碼,則可以簡單地擴展camel-core intead提供的org.apache.camel.main.Main類。 piggy帶這個類,您將不僅沒有自動設置上下文的功能,還可以獲得所有其他命令行功能,例如控制運行該進程的時間,啟用跟蹤,加載自定義路由類等。
重構前面的示例,如下所示。
package camelcoredemo;import org.slf4j.*; import org.apache.camel.builder.*; import org.apache.camel.main.Main;public class TimerMain2 extends Main {static Logger LOG = LoggerFactory.getLogger(TimerMain2.class);public static void main(String[] args) throws Exception {TimerMain2 main = new TimerMain2();main.enableHangupSupport();main.addRouteBuilder(createRouteBuilder());main.run(args);}static RouteBuilder createRouteBuilder() {return new TimerRouteBuilder();} }現在我們的TimerMain2變得更短了,您可以嘗試一下,它的功能應該與以前相同。
bash> mvn compile bash> mvn exec:java -Dexec.mainClass=camelcoredemo.TimerMain2 -Dexec.args='-t'注意,我們給了-t選項,它將轉儲Route跟蹤。 使用-h ,您將看到所有可用的選項。
將豆添加到駱駝
在上面的TimerRouteBuilder示例中,我們即時創建了一個Processor 。 現在,如果您要將幾個不同的Processor組合在一起,那么將噪音降至最低會更好。 Camel允許您通過在其注冊表空間中注冊處理Bean來做到這一點,然后您就可以在路由中將它們作為bean組件進行引用。 這是將上述示例轉換為Bean處理的方法。
package camelcoredemo;import org.slf4j.*; import org.apache.camel.*; import org.apache.camel.builder.*; import org.apache.camel.main.Main;public class TimerBeansMain extends Main {static Logger LOG = LoggerFactory.getLogger(TimerBeansMain.class);public static void main(String[] args) throws Exception {TimerBeansMain main = new TimerBeansMain();main.enableHangupSupport();main.bind("processByBean1", new Bean1());main.bind("processAgainByBean2", new Bean2());main.addRouteBuilder(createRouteBuilder());main.run(args);}static RouteBuilder createRouteBuilder() {return new RouteBuilder() {public void configure() {from("timer://timer1?period=1000").to("bean:processByBean1").to("bean:processAgainByBean2");}};}// Processor beansstatic class Bean1 implements Processor {public void process(Exchange msg) {LOG.info("First process {}", msg);}}static class Bean2 implements Processor {public void process(Exchange msg) {LOG.info("Second process {}", msg);}} }現在您看到我的Route非常狹窄,沒有雜音; 而且我已經將處理代碼重構為各個類。 當您編寫更復雜的Route來解決業務邏輯時,這可以促進更好的代碼管理和測試。 它使您可以構建類似于可重用POJO bean的積木。 除了僅處理bean外,Camel還將此注冊表空間用于許多其他服務。 例如,您可以使用其他功能和/或配置自定義許多其他組件端點。 或者諸如線程池策略實現替換之類的東西。
上面示例中的Route是使用所謂的Java DSL構建的。 該路線可讀性強,但是您將獲得完整的IDE支持,以瀏覽可用于該路線的所有方法。
我希望本文能幫助您快速開始騎駱駝之旅。 除了提到的timer組件之外, camel-core還從其核心jar中附帶了以下組件。
- 豆成分
- 瀏覽組件
- 數據集組件
- 直接成分
- 文件組件
- 日志組件
- 模擬組件
- 屬性組件
- 色達成分
- 測試組件
- 計時器組件
- 存根組件
- 驗證器組件
- vm組件
- xslt組件
玩得開心!
翻譯自: https://www.javacodegeeks.com/2013/08/getting-started-with-apache-camel-using-java.html
總結
以上是生活随笔為你收集整理的使用Java的Apache Camel入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache log4j是领先的日志记录
- 下一篇: Java 8的新增功能(第二部分–可能会