简介
camel是一个非常强大的基于规则的路由以及媒介引擎
重要名词
camel的运行容器,管理所有的camel路由。类似于spring中的context。
路由,它定义了Message如何在一个系统中传输的真实路径或者通道。路由引擎自身并不暴露给开发者,但是开发者可以自己定义路由,并且需要信任引擎可以完成复杂的传输工作。每个路由都有一个唯一的标识符,用来记录日志、调试、监控,以及启动或者停止路由。
个人理解为一向个流程走的定义。我们可以定义了一个路由规则,让一个流程按照我们定义的规则走下去,和走公司的报销流程很像。
Endpoint作为Camel系统中一个通道的端点,可以发送或者接受消息。在Camel中Endpoint使用URI来配置。在运行时Camel通过URI来查找端点。端点的功能强大、全面而且又可维护。
个人理解为一个路由(流程)的每一个环节,这个endpoint会定义在该环节中做什么操作
Component是一些Endpoints URI的集合。他们通过连接码来链接(例如file:),而且作为一个endpoint的工厂。现在Camel中又超过80个Component,可扩展。
个人理解是对Endpoint的一个封装,因为每一类Endpoint都需要一个uri作为入口。那么就需要对这个Endpoint的producer和consumer进行封装。
一个消息之间通信的抽象的会话。主要包括:
ExchangeId(唯一标识)
MEP(一种模式,有InOnly、OutOnly等)
Exception(路由过程中的异常)
Properties(可以进行传递的属性,是键值对)
Message(InMessage和OutMessage)。
Camel中一个基本的包含数据和路由的实体,Messages包含了
唯一的识别(Unique Identifier)–java.lang.String类型
头信息(Headers)–会提供一些内容的提示,头信息被组织成名值对的形式,string–>Object
内容(body)是一个Object类型的对象,这就意味着,你要确保接收器能够理解消息的内容。当消息发送器和接收器使用不同的内容格式的时候,你可以使用Camel的数据转换机制将其转换为一个特定的格式。在许多情况下预先定义类型可以被自动转换。
错误标记(fault flag)使用来标记正常或者错误的标记,通常由一些标准类定义,例如(WSDL)
是一个消息接受者和消息通信的处理器。当然,Processor是Route的一个元素,可用来消息格式转换或者其他的一些变换。
个人理解就是对exchange做处理的一个环节,不过是将它单独拿出来而已。
第一个组件 timer
1、引入maven依赖
camel 核心依赖,slf4j 用于打印log
org.apache.camel
camel-core
2.18.0
org.slf4j
slf4j-simple
1.7.5
2、使用timer组件建立一个路由,只实现简单的打印功能
注意:这个组件仅仅能用作consumer,不能用作producer。简单地说,就是只能放在from()里面,不能放在to()里面。
uri格式:timer:name[?options]
timer参数详解官网:http://camel.apache.org/timer.html
public class MyFisterRouter extends RouteBuilder{
private final static Logger LOGGER= LoggerFactory.getLogger(MyFisterRouter.class);
public void configure() throws Exception {
from("timer://timer1?period=1000").process(new Processor() {
public void process(Exchange exchange) throws Exception {
LOGGER.info("message:{}",exchange);
}
});
}
}
通过from方法调用timer组件(timer1是组件名称,period=1000代表每一秒调用一次),去调用processor(处理器)
3、建立一个main方法启动camel
public class Main {
public static void main(String[] args) throws Exception {
// 这是camel上下文对象,整个路由的驱动全靠它了。
ModelCamelContext camelContext = new DefaultCamelContext();
// 启动route
camelContext.start();
// 将我们编排的一个完整消息路由过程,加入到上下文中 Apache Camel支持动态加载/卸载编排的路由
camelContext.addRoutes(new MyFisterRouter());
// 通用没有具体业务意义的代码,只是为了保证主线程不退出
System.in.read();
}
}
启动 main函数查看日志
4、对router进行修改 将2步骤中的configure方法改造
public void configure() throws Exception {
from("timer://timer1?period=1000").
//加入信息内容
setBody().simple("test messge ${header.firedTime}").process(new Processor() {
public void process(Exchange exchange) throws Exception {
Object body = exchange.getIn().getBody();
//输出内容
LOGGER.info("message body:{}",body.toString());
Message out = exchange.getOut();
//对输出的信息进行处理
out.setBody("process message");
}
}).
//to 调用log组件输出
to("log:out");
}
重新启动查看信息输出(注意 :如果未对out进行设置则输出InMessage内容)
Camel Context 路由的容器,启动容器,加入路由,路由就会生效