camel(Camille)

Apache Camel是一个非常实用的规则引擎库,可以用来处理不同来源的事件和信息。你可以使用VM、HTTP、FTP、JMS甚至文件系统等不同的协议来传递消息

Apache Camel是一个非常实用的规则引擎库,可以用来处理不同来源的事件和信息。你可以使用VM、HTTP、FTP、JMS甚至文件系统等不同的协议来传递消息,让你的操作逻辑和传递逻辑保持分离,可以让你更专注于消息的内容。

camel(Camille)插图

在本文中,我将用Java语言(不是Groovy)提供Apache Camel的介绍演示。

首先创建一个Maven项目的pom.xml。

& lt?xml版本="1.0 "编码="UTF-8 "?& gt& ltproject xmlns = " http://maven . Apache . org/POM/4 . 0 . 0 " xmlns:xsi = " http://www . w3 . org/2001/XML schema-instance " xsi:schema location = " http://maven . Apache . org/POM/4 . 0 . 0 http://maven . Apache . org/maven-v4 _ 0 _ 0 . xsd " >& ltmodelVersion & gt4 . 0 . 0 & lt;/model version & gt;& ltgroupId & gt骆驼-春天-演示& lt/groupId & gt;& ltartifactId & gt骆驼-春天-演示& lt/artifact id & gt;& lt版本& gt1.0-快照& lt/version & gt;& lt包装& gtjar & lt/包装& gt& lt属性& gt& ltproject . build . source encoding & gt;UTF-8 & lt;/project . build . source encoding & gt;& ltcamel.version & gt2 . 11 . 1 & lt;/camel . version & gt;& lt/properties & gt;& lt依赖关系& gt& lt依赖性& gt& ltgroupId & gtorg . Apache . camel & lt;/groupId & gt;& ltartifactId & gt骆驼核心& lt/artifact id & gt;& lt版本& gt$ { camel.version } & lt/version & gt;& lt/dependency & gt;& lt依赖性& gt& ltgroupId & gtorg.slf4j & lt/groupId & gt;& ltartifactId & gtslf4j-simple & lt;/artifact id & gt;& lt版本& gt1 . 7 . 5 & lt;/version & gt;& lt/dependency & gt;& lt/dependencies & gt;& lt/project & gt;这里我们只使用camel-core.jar包,它实际上提供了许多您可能会用到的实用组件。出于日志记录的目的,我使用slf4j-simple作为日志记录的实现,这样我们就可以看到控制台的输出。

接下来,我们只需要构造一个路由类。路由就像是Camel中如何将消息从一端传递到另一端的指令定义。我们将创建src/main/Java/CamelCoreDemo/timerroutebuilder . Java文件,每秒向处理器发送一条消息,并简单地将其打印出来。

打包camelcoredemo导入org . slf4j . *;导入org . Apache . camel . *;导入org . Apache . camel . builder . *;公共类TimerRouteBuilder扩展route builder { static Logger LOG = Logger factory . get Logger(TimerRouteBuilder . class);public void configure(){ from(" timer://timer 1?周期=1000”)。process(new Processor(){ public void process(Exchange msg){ log . info(" Processing { } ",msg);}});}}这就是这个例子所需要的。现在编译并运行。

bash & gtmvn编译

bash & gtmvn exec:Java-dexec . main class = org . Apache . camel . main . main-dexec . args = '-r camelcoredemo。'计时器路由生成器'

注意,这里我们没有写Java类的main条目,我们只是把RouteBuilder的类名作为参数传递给org.apache.camel.main .然后它会自动加载route。

控制骆驼上下文

Camel启动的时候会创建一个CamelContext对象,里面有很多关于如何运行Camel的信息,也包含了我们创建的路线的定义。现在,如果您想通过CamelContext获得更多的控制,那么您需要编写自己的主类代码。我举个简单的例子。

打包camelcoredemo导入org . slf4j . *;导入org . Apache . camel . *;导入org . Apache . camel . impl . *;导入org . Apache . camel . builder . *;公共类timer main { static Logger LOG = Logger factory . get Logger(timer main . class);公共静态void main(String[] args)引发异常{new TimerMain()。run();}void run()抛出异常{ final camel context camel context = new defaultcamel context();camel context . add routes(createRouteBuilder());camel context . set tracing(true);camel context . start();Runtime.getRuntime()。addShutdownHook(new Thread(){ public void run(){ try { camel context . stop();} catch(Exception e){ throw new runtime Exception(e);}}});waitForStop();} route builder createRouteBuilder(){ return new TimerRouteBuilder();} void waitForStop(){ while(true){ try { thread . sleep(Long。MAX _ VALUE);} catch(interrupted exception e){ break;}}}}如您所见,我们在createRouteBuilder()方法中重用了现有的TimerRouteBuilder类。现在我们的主类可以完全控制何时创建、启动和停止CamelContext。Context(camelContext)对象允许您控制如何全局配置Camel,而不是在路由级别。它的JavaDoc链接给出了所有的setter方法,因此您可以研究它能做什么。

注意,我们还需要在主类中提供少量的设置代码。首先我们需要处理优雅关闭的问题,所以我们增加了一个Java关闭回调函数来调用context的stop()方法。其次,在上下文启动后,我们需要添加一个线程阻塞。如果你在启动后没有阻塞你的主线程,它在启动后会简单的退出,这是没有用的。您将把Camel作为一个服务(像服务器一样)来运行,直到您按CTRL+C来终止这个过程。

改进CamelContext的主类。

如果你不想像上面的例子那样处理主类设置代码,你可以简单地继承camel-core提供的org.apache.camel.main.Main类来代替。通过使用该类,您不仅可以自动设置上下文,还可以获得所有附加的命令行功能,例如控制流程运行的时间、启用跟踪、加载自定义路由类等等。

重构了最后一个示例,代码如下:

打包camelcoredemo导入org . slf4j . *;导入org . Apache . camel . builder . *;导入org . Apache . camel . main . main;公共类TimerMain2扩展Main { static Logger LOG = Logger factory . get Logger(timer Main 2 . class);公共静态void main(String[] args)引发异常{ timer main 2 main = new timer main 2();main . enablehanggupsupport();main . addroutebuilder(createRouteBuilder());main . run(args);}静态route builder createRouteBuilder(){ return new TimerRouteBuilder();}}现在TimerMain2类的代码比以前少了,可以试试,应该和以前功能一样。

bash & gtmvn编译

bash & gtmvn exec:Java-dexec . main class = camelcoredemo。TimerMain2 -Dexec.args='-t '

请注意,在我们给出-t选项后,路由跟踪将被转储。使用-h查看所有可用选项。

用Camel的注册机制添加bean

在前面的TimerRouteBuilder示例中,我们在代码中创建了一个匿名处理器。现在,如果你想把几个不同的处理器放在一起,使用Camel的注册机制来添加bean会更好地减少代码混乱。Camel允许您将处理作为bean注入其注册空间,然后您只需将它们作为bean组件调用。以下是我的重构代码:

打包camelcoredemo导入org . slf4j . *;导入org . Apache . camel . *;导入org . Apache . camel . builder . *;导入org . Apache . camel . main . main;公共类TimerBeansMain扩展Main { static Logger LOG = Logger factory . get Logger(TimerBeansMain . class);公共静态void main(String[] args)引发异常{ TimerBeansMain main = new TimerBeansMain();main . enablehanggupsupport();main.bind("processByBean1 ",new bean 1());main.bind("processAgainByBean2 ",new bean 2());main . addroutebuilder(createRouteBuilder());main . run(args);}静态route builder create route builder(){ return new route builder(){ public void configure(){ from(" timer://timer 1?周期=1000”)。to("bean:processByBean1 ")。to(" bean:processagainbybean 2 ");}};} // Processor beansstatic类Bean1实现处理器{ public void process(Exchange msg){ log . info(" First process { } ",msg);} }静态类Bean2实现处理器{ public void process(Exchange msg){ log . info(" Second process { } ",msg);}}}现在Route类更加简洁明了,处理代码被重构为一个独立的类。当你需要编写复杂的路由来实现业务逻辑时,这种方法可以帮助你更好地组织和测试你的代码。它允许你像乐高积木一样建造可重复使用的POJO bean。Camel的注册空间还可以用于许多其他目的。例如,您可以定制许多具有附加功能的端点组件,或者注册一些信息,或者替换线程池实现策略中的内容。

上面的路由示例由所谓的Java DSL组成,可读性很高。在IDE提供的支持下,您可以检查所有可用于Route的方法。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/178155.html

发表回复

登录后才能评论