Apache Camel是一个非常有用的库,可以帮助您处理来自许多不同来源的事件或消息。 您可以通过许多不同的协议(例如在VM,HTTP,FTP,JMS甚至DIRECTORY / FILE之间)移动这些消息,但仍使处理代码不受传输逻辑的影响。 这样,您就可以专注于摘要消息的内容。
在这里,我将提供一个教程,介绍如何使用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
,它实际上包含许多您可能会使用的有用组件。 同样出于记录目的,我添加了一个slf4j-simple
作为记录器实现,因此我们可能会在控制台上看到输出。
接下来,您只需要一个类即可构造Route
。 Route
就像是对骆驼的指令定义,关于如何将消息从一个点移动到另一个点。 我们将创建src/main/java/camelcoredemo/TimerRouteBuilder.java
文件,该文件将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 主类,而只是使用org.apache.camel.main.Main
选项来接受RouteBuilder
类名作为参数。 然后它将自动加载并创建路线。
控制
启动Camel时,它将创建一个CamelContext
对象,该对象包含有关如何运行它的许多信息,包括我们创建的Route
的定义。 现在,如果您想对此CamelContext
进行更多控制,则需要编写自己的Main
类。 我会在这里给你看一个简单的例子。
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
类。 现在,我们的Main
类可以完全控制何时创建,启动和停止CamelContext
。 此上下文使您可以控制如何全局配置骆驼,而不是在Route
级别。 javadoc链接提供了您可以探索的所有setter方法。
注意,我们还需要在Main
类中提供一些设置代码。 首先,我们需要处理正常关闭,因此我们添加了一个Java关闭挂钩来调用上下文stop()
。 其次,我们需要在上下文启动后添加一个线程块。 原因是CamelContext#start()
方法是非阻塞的! 如果您在启动后没有阻塞Main
线程,那么它将仅在它之后立即退出,这将没有太大用处。 您想要将Camel作为服务(例如服务器)运行,直到您明确按CTRL+C
终止该过程为止。
改进
如果您不想处理上面的许多Main
类设置代码,则可以简单地扩展camel-core
intead提供的org.apache.camel.main.Main
类。 piggy带这个类,您将不仅没有自动设置上下文的功能,还可以获得所有其他命令行功能,例如控制运行该进程的时间,启用跟踪,加载自定义路由类等。
重构前面的示例,如下所示。
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
,您将看到所有可用的选项。
将豆添加到骆驼
在上面的TimerRouteBuilder
示例中,我们即时创建了一个Processor
。 现在,如果您要将几个不同的Processor
组合在一起,那么将噪音降至最低会更好。 Camel允许您通过在其注册表空间中注册处理Bean来做到这一点,然后您就可以在路由中将它们作为bean
组件进行引用。 这是将上述示例转换为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的积木。 除了仅处理bean外,Camel还将此注册表空间用于许多其他服务。 例如,您可以使用其他功能和/或配置自定义许多其他组件端点。 或者诸如线程池策略实现替换之类的东西。
上面示例中的Route
是使用所谓的Java DSL构建的。 该路线可读性强,但是您将获得完整的IDE支持,以浏览可用于该路线的所有方法。
我希望本文能帮助您快速开始骑骆驼之旅。 除了提到的timer
组件之外, camel-core
还从其核心jar中附带了以下组件。
- 豆成分
- 浏览组件
- 数据集组件
- 直接成分
- 文件组件
- 日志组件
- 模拟组件
- 属性组件
- 色达成分
- 测试组件
- 计时器组件
- 存根组件
- 验证器组件
- vm组件
- xslt组件
玩得开心!
翻译自: https://www.javacodegeeks.com/2013/08/getting-started-with-apache-camel-using-java.html