程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Apache Camel的Java編程入門指南

Apache Camel的Java編程入門指南

編輯:關於JAVA

Apache Camel的Java編程入門指南。本站提示廣大學習愛好者:(Apache Camel的Java編程入門指南)文章只能為提供參考,不一定能成為您想要的結果。以下是Apache Camel的Java編程入門指南正文


 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.0
http://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 compile
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取得更多的掌握,那末你須要編寫本身的主類代碼。我在這舉個簡略的例子。
 

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類。如今我們的主類對在甚麼時刻創立、啟動、停滯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 compile
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組件來停止挪用。以下是我的重構代碼:
 

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 beans
static 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的探索階段。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved