apache camel 简单使用 及第一个路由apache-timer组件

简介

camel是一个非常强大的基于规则的路由以及媒介引擎

重要名词

  • Camel Context 

camel的运行容器,管理所有的camel路由。类似于spring中的context。

  • Route 

路由,它定义了Message如何在一个系统中传输的真实路径或者通道。路由引擎自身并不暴露给开发者,但是开发者可以自己定义路由,并且需要信任引擎可以完成复杂的传输工作。每个路由都有一个唯一的标识符,用来记录日志、调试、监控,以及启动或者停止路由。 

个人理解为一向个流程走的定义。我们可以定义了一个路由规则,让一个流程按照我们定义的规则走下去,和走公司的报销流程很像。

  • Endpoint 

Endpoint作为Camel系统中一个通道的端点,可以发送或者接受消息。在Camel中Endpoint使用URI来配置。在运行时Camel通过URI来查找端点。端点的功能强大、全面而且又可维护。 

个人理解为一个路由(流程)的每一个环节,这个endpoint会定义在该环节中做什么操作

  • Component 

Component是一些Endpoints URI的集合。他们通过连接码来链接(例如file:),而且作为一个endpoint的工厂。现在Camel中又超过80个Component,可扩展。 

个人理解是对Endpoint的一个封装,因为每一类Endpoint都需要一个uri作为入口。那么就需要对这个Endpoint的producer和consumer进行封装。

  • Exchange : 

一个消息之间通信的抽象的会话。主要包括: 

ExchangeId(唯一标识) 

MEP(一种模式,有InOnly、OutOnly等) 

Exception(路由过程中的异常) 

Properties(可以进行传递的属性,是键值对) 

Message(InMessage和OutMessage)。

  • Message 

Camel中一个基本的包含数据和路由的实体,Messages包含了 

唯一的识别(Unique Identifier)–java.lang.String类型 

头信息(Headers)–会提供一些内容的提示,头信息被组织成名值对的形式,string–>Object 

内容(body)是一个Object类型的对象,这就意味着,你要确保接收器能够理解消息的内容。当消息发送器和接收器使用不同的内容格式的时候,你可以使用Camel的数据转换机制将其转换为一个特定的格式。在许多情况下预先定义类型可以被自动转换。 

错误标记(fault flag)使用来标记正常或者错误的标记,通常由一些标准类定义,例如(WSDL)

  • Processor 

是一个消息接受者和消息通信的处理器。当然,Processor是Route的一个元素,可用来消息格式转换或者其他的一些变换。 

个人理解就是对exchange做处理的一个环节,不过是将它单独拿出来而已。

第一个组件 timer

1、引入maven依赖

camel 核心依赖,slf4j 用于打印log

<dependencies>

<dependency>

<groupId>org.apache.camel</groupId>

<artifactId>camel-core</artifactId>

<version>2.18.0</version>

</dependency>

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-simple</artifactId>

<version>1.7.5</version>

</dependency>

</dependencies>

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  路由的容器,启动容器,加入路由,路由就会生效

猜你喜欢

转载自blog.csdn.net/asd5629626/article/details/81627444