apache camel_使用Java的Apache Camel入门
apache camel
Apache Camel是一個非常有用的庫,可以幫助您處理來自許多不同來源的事件或消息。 您可以通過許多不同的協(xié)議(例如在VM,HTTP,FTP,JMS甚至DIRECTORY / FILE之間)移動這些消息,但仍然使處理代碼沒有傳輸邏輯。 這樣,您就可以專注于摘要消息的內(nèi)容。
在這里,我將提供一個教程,介紹如何使用Java而不是Groovy來開始使用Apache Camel。
讓我們首先創(chuàng)建一個Maven項目pom.xml文件。
我們將僅探索camel-core ,它實際上包含許多您可能會使用的有用組件。 同樣出于記錄目的,我添加了一個slf4j-simple作為記錄器實現(xiàn),因此我們可能會在控制臺上看到輸出。
接下來,您只需要一個類即可構(gòu)造Route 。 Route就像是對駱駝的指令定義,關(guān)于如何將消息從一個點移動到另一個點。 我們將創(chuàng)建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);}});} }這就是您開始所需要的。 現(xiàn)在您可以構(gòu)建并運行此簡單演示。
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類名作為參數(shù)。 然后它將自動加載并創(chuàng)建路線。
控制
啟動Camel時,它將創(chuàng)建一個CamelContext對象,該對象包含有關(guān)如何運行它的許多信息,包括我們創(chuàng)建的Route的定義。 現(xiàn)在,如果您想對此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()方法中重新使用了現(xiàn)有的TimerRouteBuilder類。 現(xiàn)在,我們的Main類可以完全控制何時創(chuàng)建,啟動和停止CamelContext 。 此上下文使您可以控制如何全局配置駱駝,而不是在Route級別。 javadoc鏈接提供了您可以探索的所有setter方法。
注意,我們還需要在Main類中提供一些設(shè)置代碼。 首先,我們需要處理正常關(guān)閉,因此我們添加了一個Java關(guān)閉掛鉤來調(diào)用上下文stop() 。 其次,我們需要在上下文啟動后添加一個線程塊。 原因是CamelContext#start()方法是非阻塞的! 如果您在啟動后沒有阻塞Main線程,那么它將在緊隨其后退出,將沒有太大用處。 您想要將Camel作為服務(wù)(例如服務(wù)器)運行,直到您明確按CTRL+C終止該過程為止。
改進
如果您不想處理很多諸如上述的Main類設(shè)置代碼,則可以簡單地擴展camel-core intead提供的org.apache.camel.main.Main類。 piggy帶這個類,您將不僅沒有自動設(shè)置上下文的功能,而且還可以獲得所有其他命令行功能,例如控制運行該進程的時間,啟用跟蹤,加載自定義路由類等。
重構(gòu)前面的示例,如下所示。
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();} }現(xiàn)在我們的TimerMain2變得更短了,您可以嘗試一下,它的功能應(yīng)與以前相同。
bash> mvn compile bash> mvn exec:java -Dexec.mainClass=camelcoredemo.TimerMain2 -Dexec.args='-t'注意,我們給了-t選項,它將轉(zhuǎn)儲Route跟蹤。 使用-h ,您將看到所有可用的選項。
將豆添加到駱駝
在上面的TimerRouteBuilder示例中,我們即時創(chuàng)建了一個Processor 。 現(xiàn)在,如果您要將幾個不同的Processor組合在一起,那么將噪音降至最低會更好。 Camel允許您通過在其注冊表空間中注冊處理Bean來做到這一點,然后只需在路由中將它們作為bean組件進行引用即可。 這是將上述示例轉(zhuǎn)換為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);}} }現(xiàn)在您看到我的Route非常狹窄,沒有雜波; 并且我已經(jīng)將處理代碼重構(gòu)為各個類。 當(dāng)您編寫更復(fù)雜的Route來解決業(yè)務(wù)邏輯時,這可以促進更好的代碼管理和測試。 它使您可以構(gòu)建類似于可重用POJO bean塊的LEGO。 除了僅處理bean外,Camel還將此注冊表空間用于許多其他服務(wù)。 例如,您可以使用其他功能和/或配置來自定義許多其他組件端點。 或者諸如線程池策略實現(xiàn)替換之類的東西。
上面示例中的Route是使用所謂的Java DSL構(gòu)建的。 該路線可讀性強,但是您將獲得完整的IDE支持,以瀏覽可用于該路線的所有方法。
我希望本文能幫助您快速開始騎駱駝。 除了提到的timer組件之外, camel-core還從其核心jar中附帶了以下組件。
- 豆成分
- 瀏覽組件
- 數(shù)據(jù)集組件
- 直接成分
- 文件組件
- 日志組件
- 模擬組件
- 屬性組件
- 色達(dá)成分
- 測試組件
- 計時器組件
- 存根組件
- 驗證器組件
- vm組件
- xslt組件
玩得開心!
翻譯自: https://www.javacodegeeks.com/2013/08/getting-started-with-apache-camel-using-java.html
apache camel
總結(jié)
以上是生活随笔為你收集整理的apache camel_使用Java的Apache Camel入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web应用插件开发_Web应用程序的简单
- 下一篇: JDK 9/10/11:Java字符串上