亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Apache Camel的Java編程入門指南

2019-11-26 15:06:19
字體:
來源:轉載
供稿:網友

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

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

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

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion><groupId>camel-spring-demo</groupId><artifactId>camel-spring-demo</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging> <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><camel.version>2.11.1</camel.version></properties> <dependencies><dependency><groupId>org.apache.camel</groupId><artifactId>camel-core</artifactId><version>${camel.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.5</version></dependency></dependencies> </project>

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

接下來我們只需要構造一個路由類。路由就好比是Camel中怎樣將消息從一端傳遞到另一端的一個指令定義。我們將會創建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 compilebash> 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獲得更多的控制,那么你需要編寫自己的主類代碼。我在這舉個簡單的例子。
 

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類?,F在我們的主類對在什么時候創建、啟動、停止CamelContext有了完全的控制。context(camelContext)對象允許你全局性地控制如何配置Camel,而不是在Route級。它的JavaDoc鏈接給出了所有setter方法,你可以研究下它都可以做些什么。

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

改善啟動CamelContext的主類

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

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

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 compilebash> mvn exec:java -Dexec.mainClass=camelcoredemo.TimerMain2 -Dexec.args='-t'

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

用Camel的注冊機制添加bean

在之前的TimerRouteBuilder例子中,我們已經在代碼中創建了一個匿名Processor?,F在如果你想將幾個不同的Processor放在一起,那么使用Camel的注冊機制添加bean的方式將能更好的減少代碼混亂。Camel允許你通過將processing當作bean注入到它的registry space,然后你只要把它們當作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。Camel的registry space同樣可用于其他很多用途,比如你可以自定義許多具有附加功能的endpoint組件或者注冊一些信息,更或者替換線程池實現策略之內的事情。

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

我希望這篇文章能夠幫助你跳過Camel的摸索階段。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲激情视频在线| 日韩av综合网站| 久久人体大胆视频| 最近2019年中文视频免费在线观看| 狠狠躁18三区二区一区| 亚洲无限乱码一二三四麻| 社区色欧美激情 | 亚洲一级黄色av| 精品日韩视频在线观看| 国产偷亚洲偷欧美偷精品| 亚洲人成网在线播放| 成人黄色免费在线观看| 97视频在线观看免费高清完整版在线观看| 久久福利视频导航| 日本久久中文字幕| 欧美国产日韩二区| 亚洲va欧美va在线观看| 国产69精品久久久久久| 色综合色综合网色综合| 欧美第一页在线| 米奇精品一区二区三区在线观看| 日韩电影免费在线观看中文字幕| 一区二区三区四区视频| 日韩视频在线一区| 国产精品极品美女粉嫩高清在线| 日韩视频在线免费| 国产精品扒开腿做爽爽爽男男| 亚洲无av在线中文字幕| 国产精品亚洲自拍| 欧美精品久久久久久久久久| 69久久夜色精品国产69| 久久精品成人一区二区三区| 亚洲欧美中文日韩在线| 日本三级久久久| 精品美女永久免费视频| 国产主播在线一区| 国产精品亚洲一区二区三区| 久久久久久久久久国产| 91精品视频免费看| 日韩欧美国产高清91| 欧美乱大交做爰xxxⅹ性3| 色婷婷综合成人| 国产啪精品视频| 亚洲欧美日韩中文在线制服| 日韩美女av在线| 亚洲摸下面视频| 日韩精品免费在线视频观看| 海角国产乱辈乱精品视频| 高清亚洲成在人网站天堂| 中文字幕亚洲第一| 91精品国产乱码久久久久久久久| 亚洲影院污污.| 日本国产精品视频| 久久99国产综合精品女同| 亚洲精品永久免费精品| 久久久久亚洲精品| 国产成人综合久久| 国产69精品久久久久99| 久久久久久久国产| 国产亚洲欧洲高清一区| 日韩在线视频免费观看| 日韩久久免费视频| 性色av一区二区三区免费| 亚洲成av人影院在线观看| 亚洲精品一区在线观看香蕉| 亚洲免费视频观看| 国产视频精品一区二区三区| 日韩成人中文字幕| 欧美在线激情视频| 欧美区二区三区| 疯狂做受xxxx欧美肥白少妇| 欧美三级欧美成人高清www| 国产91热爆ts人妖在线| 91视频88av| 国产视频久久久| 精品欧美激情精品一区| 色av中文字幕一区| 动漫精品一区二区| 最近2019年中文视频免费在线观看| 欧美日韩亚洲一区二| 不卡av在线网站| 久久免费成人精品视频| 麻豆国产va免费精品高清在线| 68精品国产免费久久久久久婷婷| 久久久999国产| 亚洲国产精品久久91精品| 国产专区欧美专区| 91高清视频在线免费观看| 欧美丰满少妇xxxxx| 久久亚洲欧美日韩精品专区| 国产精品日韩专区| 久久久av一区| 不卡毛片在线看| 国精产品一区一区三区有限在线| 色综合91久久精品中文字幕| 欧美放荡办公室videos4k| 亚洲天堂2020| 国产精品久久久久免费a∨大胸| 在线观看精品自拍私拍| 精品av在线播放| 久久久久久久香蕉网| 亚洲一区二区在线播放| 国产精品视频一区国模私拍| 亚洲成人国产精品| 国产日韩av在线播放| 欧美激情精品久久久久久免费印度| 在线丨暗呦小u女国产精品| 精品国产一区二区三区久久| 久久香蕉国产线看观看网| 国产精品久久久久久久app| 亚洲一区二区三区在线免费观看| 国产成人精品999| 精品露脸国产偷人在视频| 亚洲精品网站在线播放gif| 亚洲精品资源美女情侣酒店| 久久久电影免费观看完整版| 日韩成人在线免费观看| 欧美有码在线观看视频| 日韩电影免费在线观看中文字幕| 国产成人激情小视频| 一本一本久久a久久精品综合小说| 日韩在线观看你懂的| 国产欧美在线看| 日韩在线视频一区| 91久久综合亚洲鲁鲁五月天| 国产成人精品优优av| 超碰日本道色综合久久综合| 国产精品私拍pans大尺度在线| 欧美巨乳美女视频| 91网在线免费观看| 国产日本欧美一区| 日韩精品视频免费专区在线播放| 国产小视频国产精品| 欧美另类在线播放| 久久久久久亚洲| 日本欧美一级片| 爱福利视频一区| 欧美日韩中文字幕在线视频| 欧美日韩中文字幕在线视频| 69av视频在线播放| 精品毛片网大全| 日韩三级成人av网| 精品欧美一区二区三区| 国内偷自视频区视频综合| 欧美猛男性生活免费| 92福利视频午夜1000合集在线观看| 91丝袜美腿美女视频网站| 国产精品网红福利| 国产精品草莓在线免费观看| 一区二区欧美亚洲| 亚洲性无码av在线| 91亚洲精品在线| 国产精品久久久久久av| 精品动漫一区二区三区| 久久久久久美女| 国产精品久久久久久av下载红粉| 亚洲美女av电影| 精品视频在线播放色网色视频| 国产精品久久久久久久app| 亚洲人成网站在线播| 亚洲影院高清在线| 狠狠色狠狠色综合日日小说| 午夜精品理论片| 日韩av免费网站|