偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

針對Java開發(fā)者的Apache Camel入門指南

開發(fā) 后端
Apache Camel是一個非常實用的規(guī)則引擎庫,能夠用來處理來自于不同源的事件和信息。你可以在使用不同的協(xié)議比如VM,HTTP,F(xiàn)TP,JMS甚至是文件系統(tǒng)中來傳遞消息,并且讓你的操作邏輯和傳遞邏輯保持分離,這能夠讓你更專注于消息的內(nèi)容。

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

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

首先創(chuàng)建一個Maven項目的pom.xml。

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" 
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4. xsi:schemaLocation="  
  5. http://maven.apache.org/POM/4.0.0  
  6. http://maven.apache.org/maven-v4_0_0.xsd"> 
  7.  
  8. <modelVersion>4.0.0</modelVersion> 
  9. <groupId>camel-spring-demo</groupId> 
  10. <artifactId>camel-spring-demo</artifactId> 
  11. <version>1.0-SNAPSHOT</version> 
  12. <packaging>jar</packaging> 
  13.  
  14. <properties> 
  15. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
  16. <camel.version>2.11.1</camel.version> 
  17. </properties> 
  18.  
  19. <dependencies> 
  20. <dependency> 
  21. <groupId>org.apache.camel</groupId> 
  22. <artifactId>camel-core</artifactId> 
  23. <version>${camel.version}</version> 
  24. </dependency> 
  25. <dependency> 
  26. <groupId>org.slf4j</groupId> 
  27. <artifactId>slf4j-simple</artifactId> 
  28. <version>1.7.5</version> 
  29. </dependency> 
  30. </dependencies> 
  31.  
  32. </project> 

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

接下來我們只需要構(gòu)造一個路由類。路由就好比是Camel中怎樣將消息從一端傳遞到另一端的一個指令定義。我們將會創(chuàng)建src/main/java /camelcoredemo/TimerRouteBuilder.java文件,每隔一秒向處理器發(fā)送一個消息,簡單打印出來。

  1. package camelcoredemo;  
  2.  
  3. import org.slf4j.*;  
  4. import org.apache.camel.*;  
  5. import org.apache.camel.builder.*;  
  6.  
  7. public class TimerRouteBuilder extends RouteBuilder {  
  8. static Logger LOG = LoggerFactory.getLogger(TimerRouteBuilder.class);  
  9. public void configure() {  
  10. from("timer://timer1?period=1000")  
  11. .process(new Processor() {  
  12. public void process(Exchange msg) {  
  13. LOG.info("Processing {}", msg);  
  14. }  
  15. });  
  16. }  

以上就是這個示例的全部所需,現(xiàn)在編譯運(yùn)行。

  1. bash> mvn compile  
  2. bash> mvn exec:java -Dexec.mainClass=org.apache.camel.main.Main -Dexec.args='-r camelcoredemo.TimerRouteBuilder' 

注意,這里我們并沒有編寫Java類的main入口,我們只是將RouteBuilder的類名當(dāng)作參數(shù)簡單傳遞給 org.apache.camel.main.Main,然后它將自動加載路由。

控制CamelContext

當(dāng)啟動Camel后,它會創(chuàng)建一個CamelContext對象,該對象擁有了很多關(guān)于如何運(yùn)行Camel的信息,還包含我們所創(chuàng)建的Route的定義?,F(xiàn)在如果你想通過CamelContext獲得更多的控制,那么你需要編寫自己的主類代碼。我在這舉個簡單的例子。

  1. package camelcoredemo;  
  2.  
  3.  
  4.  
  5.  
  6. import org.slf4j.*;  
  7. import org.apache.camel.*;  
  8. import org.apache.camel.impl.*;  
  9. import org.apache.camel.builder.*;  
  10.  
  11.  
  12.  
  13.  
  14. public class TimerMain {  
  15. static Logger LOG = LoggerFactory.getLogger(TimerMain.class);  
  16. public static void main(String[] args) throws Exception {  
  17. new TimerMain().run();  
  18. }  
  19. void run() throws Exception {  
  20. final CamelContext camelContext = new DefaultCamelContext();  
  21. camelContext.addRoutes(createRouteBuilder());  
  22. camelContext.setTracing(true);  
  23. camelContext.start();  
  24.  
  25.  
  26.  
  27.  
  28. Runtime.getRuntime().addShutdownHook(new Thread() {  
  29. public void run() {  
  30. try {  
  31. camelContext.stop();  
  32. catch (Exception e) {  
  33. throw new RuntimeException(e);  
  34. }  
  35. }  
  36. });  
  37.  
  38.  
  39.  
  40.  
  41. waitForStop();  
  42. }  
  43. RouteBuilder createRouteBuilder() {  
  44. return new TimerRouteBuilder();  
  45. }  
  46. void waitForStop() {  
  47. while (true) {  
  48. try {  
  49. Thread.sleep(Long.MAX_VALUE);  
  50. catch (InterruptedException e) {  
  51. break;  
  52. }  
  53. }  
  54. }  

可以看到,我們在createRouteBuilder()方法中重用了已有的TimerRouteBuilder類?,F(xiàn)在我們的主類對在什么時候創(chuàng)建、啟動、停止CamelContext有了完全的控制。context(camelContext)對象允許你全局性地控制如何配置Camel,而不是在 Route級。它的JavaDoc鏈接給出了所有setter方法,你可以研究下都可以做些什么。

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

#p#

改善啟動CamelContext的主類

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

重構(gòu)了下上一個例子,代碼如下:

  1. package camelcoredemo;  
  2.  
  3. import org.slf4j.*;  
  4. import org.apache.camel.builder.*;  
  5. import org.apache.camel.main.Main;  
  6.  
  7. public class TimerMain2 extends Main {  
  8. static Logger LOG = LoggerFactory.getLogger(TimerMain2.class);  
  9. public static void main(String[] args) throws Exception {  
  10. TimerMain2 main = new TimerMain2();  
  11. main.enableHangupSupport();  
  12. main.addRouteBuilder(createRouteBuilder());  
  13. main.run(args);  
  14. }  
  15. static RouteBuilder createRouteBuilder() {  
  16. return new TimerRouteBuilder();  
  17. }  

現(xiàn)在TimerMain2類的代碼比之前的更少了,你可以試試看,它應(yīng)該和之前的功能一樣。

  1. bash> mvn compile  
  2. bash> mvn exec:java -Dexec.mainClass=camelcoredemo.TimerMain2 -Dexec.args='-t' 

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

用Camel的注冊機(jī)制添加bean

在之前的TimerRouteBuilder例子中,我們已經(jīng)在代碼中創(chuàng)建了一個匿名Processor。現(xiàn)在如果你想將幾個不同的Processor放在一起,那么使用Camel的注冊機(jī)制添加bean的方式將能更好的減少代碼混亂。Camel允許你通過將processing當(dāng)作bean注入到它的 registry space,然后你只要把它們當(dāng)作bean組件來進(jìn)行調(diào)用。如下是我的重構(gòu)代碼:

  1. package camelcoredemo;  
  2.  
  3. import org.slf4j.*;  
  4. import org.apache.camel.*;  
  5. import org.apache.camel.builder.*;  
  6. import org.apache.camel.main.Main;  
  7.  
  8. public class TimerBeansMain extends Main {  
  9. static Logger LOG = LoggerFactory.getLogger(TimerBeansMain.class);  
  10. public static void main(String[] args) throws Exception {  
  11. TimerBeansMain main = new TimerBeansMain();  
  12. main.enableHangupSupport();  
  13. main.bind("processByBean1"new Bean1());  
  14. main.bind("processAgainByBean2"new Bean2());  
  15. main.addRouteBuilder(createRouteBuilder());  
  16. main.run(args);  
  17. }  
  18. static RouteBuilder createRouteBuilder() {  
  19. return new RouteBuilder() {  
  20. public void configure() {  
  21. from("timer://timer1?period=1000")  
  22. .to("bean:processByBean1")  
  23. .to("bean:processAgainByBean2");  
  24. }  
  25. };  
  26. }  
  27.  
  28. // Processor beans  
  29. static class Bean1 implements Processor {  
  30. public void process(Exchange msg) {  
  31. LOG.info("First process {}", msg);  
  32. }  
  33. }  
  34. static class Bean2 implements Processor {  
  35. public void process(Exchange msg) {  
  36. LOG.info("Second process {}", msg);  
  37. }  
  38. }  

現(xiàn)在Route類更簡潔明了,同時處理代碼也被重構(gòu)到了獨(dú)立的類中。當(dāng)你需要編寫很復(fù)雜的Route來實現(xiàn)業(yè)務(wù)邏輯時,這種方式能夠幫助你更好的組織和測試你的代碼。它能夠讓你構(gòu)建像”樂高“積木那樣可復(fù)用的POJO bean。Camel的registry space同樣可用于其他很多用途,比如你可以自定義許多具有附加功能的endpoint組件或者注冊一些信息,更或者替換線程池實現(xiàn)策略之內(nèi)的事情。

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

我希望這篇文章能夠幫助你跳過Camel的摸索階段。除了已經(jīng)提到的事件組件之外,camel還提供了如下組件:

Have fun!

英文原文:Getting Started with Apache Camel using Java

譯文鏈接:http://www.oschina.net/translate/getting-started-with-apache-camel-using

責(zé)任編輯:林師授 來源: OSCHINA編譯
相關(guān)推薦

2024-05-07 08:45:16

OpenAILlamaIndex大語言模型

2017-11-27 13:09:00

AndroidGradle代碼

2013-10-22 09:54:42

開發(fā)者應(yīng)用

2025-03-17 08:00:00

2024-02-01 09:37:42

Kubernetes服務(wù)網(wǎng)格? 命令

2023-09-11 08:47:20

Go模式uilder

2018-03-27 23:25:40

Paddle

2014-07-28 09:15:02

開發(fā)框架

2024-03-21 08:18:00

Chrome前端瀏覽器

2018-07-18 09:12:05

開發(fā)者Java工具

2023-05-19 10:04:18

Vue開發(fā)者代碼

2019-08-16 10:55:37

開發(fā)者技能AI

2012-05-16 18:30:29

iPhone

2019-02-21 13:40:35

Javascript面試前端

2022-01-02 23:26:08

開發(fā)SDK Sentry

2013-12-18 14:41:06

蘋果開發(fā)者iOS 7

2017-06-30 09:47:45

PythonJava開發(fā)者

2012-06-13 01:23:30

開發(fā)者程序員

2009-02-19 08:46:31

Windows 7開發(fā)者指南下載

2022-01-18 23:26:45

開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號