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.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
,它实际上包含许多您可能会使用的有用组件。 同样出于记录目的,我添加了一个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 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的积木。 除了仅处理bean外,Camel还将此注册表空间用于许多其他服务。 例如,您可以使用其他功能和/或配置自定义许多其他组件端点。 或者诸如线程池策略实现替换之类的东西。
上面示例中的Route
是使用所谓的Java DSL构建的。 该路线可读性强,但是您将获得完整的IDE支持,以浏览可用于该路线的所有方法。
我希望本文能帮助您快速开始骑骆驼之旅。 除了提到的timer
组件之外, camel-core
还从其核心jar中附带了以下组件。
玩得开心!
翻译自: https://www.javacodegeeks.com/2013/08/getting-started-with-apache-camel-using-java.html