Apache Camel的Java编程入门指南_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的摸索阶段。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
camel
编程入门指南、编程入门指南 v1.5、萧井陌 编程入门指南、萧大的编程入门指南、编程入门指南 v1.4,以便于您获取更多的相关知识。

时间: 2024-08-30 20:31:58

Apache Camel的Java编程入门指南_java的相关文章

[译]函数式响应编程入门指南

本文讲的是[译]函数式响应编程入门指南, 原文地址:An Introduction to Functional Reactive Programming 原文作者:Daniel Lew 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:龙骑将杨影枫 校对者:jasonxia23.Tobias Lee 函数式响应编程入门指南 今年,我做了一场有关函数式响应编程(functional reactive programming,简称 FRP)的演讲,演讲的内容

Python的设计模式编程入门指南_python

有没有想过设计模式到底是什么?通过本文可以看到设计模式为什么这么重要,通过几个Python的示例展示为什么需要设计模式,以及如何使用.设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码.反之,设计模式更为高级,它是一种必须在特定情形下实现的一种方法模板.设计模式不会绑定具体的编程语言.一个好的设计模式应该能够用大部分编程语言实现(如果做不到全部的话,具体取决于语言特性).最为重要的是,设计模式

《Visual Basic 2012入门经典》---- 2.7 快速而简单的编程入门指南

2.7 快速而简单的编程入门指南 Visual Basic 2012入门经典编程很复杂.所有东西都互相关联,因此很难将每个编程概念分开然后用线性方式加以说明.相反,在学习一个主题的过程中,通常在学到另一个主题前就需要接触它.正如第1章指出的,我尽量避免这种前向参考,但有些概念需要你首先熟悉一下.这些主题在对应的章节中都将介绍,但阅读本书之前你必须至少听说过. 2.7.1 用变量存储值 变量是代码中用于保存值的元素.例如,可以创建一个保存用户名或用户年龄的变量.每个变量(存储实体)都必须在使用前创

Google Java 编程风格指南

前言 这份文档是Google Java编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才认为它符合Google的Java编程风格. 与其它的编程风格指南一样,这里所讨论的不仅仅是编码格式美不美观的问题, 同时也讨论一些约定及编码标准.然而,这份文档主要侧重于我们所普遍遵循的规则, 对于那些不是明确强制要求的,我们尽量避免提供意见. 1.1 术语说明 在本文档中,除非另有说明: 术语class可表示一个普通类,枚举类,接口或是annotation类型(@interfac

Google Java编程风格指南

作者:Hawstein出处:http://hawstein.com/posts/google-java-style.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. 目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 这份文档是Google Java编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才认为它符合Googl

Java开发者结合Node.js编程入门教程_java

首先, 我必须得承认,作为一个有着十多年开发经验的java开发者,我已经形成了解决绝大部分问题的固有套路,尽管它们很多时候显得笨重和繁琐. 比如说如果要读取一个文件,那应该就是初始化一个BufferedReader 实例并传入一个FileReader,这几乎是顺理成章的,我在很多自认为算得上"企业级"的项目中编写这样的代码并且很享受这个过程,可以说我就是一个对其他语言不屑一顾的java脑残粉.      如果你正在阅读这篇博文,你可能已经陷入了我多年前早就陷入的一个误区,作为一名合格的

Java的Socket通讯基础编程完全指南_java

什么是Socket网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定. 但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的.在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程. Socket通讯的过程Server端Listen(监听)某个端口是否

NetBeans IDE 6.0 Java快速入门指南

欢迎使用 NetBeans IDE! 本教程提供 NetBeans IDE 工作流程的简单介绍和快速指南.我们将指导大家创建一个简单的 "Hello World" Java 控制台应用程序.完成此教程之后,您将具备如何在 IDE 中创建.编译和运行应 用程序的基本知识. 本教程可在 10 分钟之内完成. 完成本教程之后,您可以继续学习 NetBeans IDE 的 在线文档中心.该部分提供的教程全面介绍了众 多 IDE 特性和编程技巧,可应用于各种应用程序类型.如果对 "He

Java Gradle入门指南之依赖管理(添加依赖、仓库、版本冲突) (转)

本文为作者原创,转载请注明出处:http://www.cnblogs.com/gzdaijie/p/5296624.html 目录 1.添加依赖包名1.1 依赖类型1.2 声明依赖1.3 添加java依赖1.4 查找依赖包名1.5 完整的例子2.添加依赖仓库3.依赖常见问题3.1 依赖传递性3.2 版本冲突3.3 动态依赖3.4 更多设置 开发任何软件,如何管理依赖是一道绕不过去的坎,软件开发过程中,我们往往会使用这样那样的第三方库,这个时候,一个好的依赖管理就显得尤为重要了.作为一个自动构建工