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