Apache Camel笔记
1. Apache Camel概念
Apache Camel是一个轻量级的应用集成开发框架,专注于简化集成应用的开发。它基于Enterprise Integration Patterns(企业集成模式,简称EIP)的设计理念,提供了灵活的路由和中介机制,用于解决不同应用系统之间的消息传输问题。Apache Camel的主要特点如下: 使用基于SEDA处理模型的高度可伸缩的企业服务器。 支持REST API。 强大的基于EIP模式的事件路由机制。 动态、声明性的、基于内容和基于规则的路由选项。 易扩展。 可以结合Spring boot使用。
Apache Camel提供多种领域语言来定义路由规则,包括基于Java的Fluent API、Spring或者Blueprint XML配置文件、Scala DSL等。用户可以通过IDE或者Java、Scala或者XML编辑器获得智能化路由规则补全功能。 Apache Camel的使用场景包括: 消息汇聚:例如,有来自不同服务器的消息,有ActiveMQ、RabbitMQ、WebService等,想把它们都存储到日志文件中,可以通过Apache Camel定义路由规则实现。 接口对接:例如,接口报文转换,比如json格式/内容;协议转换,比如不同协议的接口适配;数据对接,比如ETL数据清洗等。在应用架构中通常用于和外部系统进行集成对接。特别适合在大的金融行业、电信行业等系统特别复杂的场景下做系统对接集成工作。对于小型的应用集成项目很难体现出Apache Camel的应用优势,可以根据自身的业务应用需求来灵活选择。
2. endpoints 端点定义
从哪个端点来, 到哪个端点去
支持http、file、kafka、mq 等消息端点类型:
(1)file:directoryName 官方手册链接
(2)http:hostname[:port][/resourceUri][?options] , 例如:http://127.0.0.1:8080/order?orderId=123 官方手册链接
(3)sftp:host:port/directoryName 官方手册链接
(4)kafka:topic[?options] 例如:kafka:my_topic?headerFilterStrategy=#myStrategy 官方手册链接
// java dsl 方式定义
RouteBuilder builder = new RouteBuilder() {
public void configure() {
String endpoint1 = "sftp:localhost:8081/folder/test.json"; // 端点1:请求到sftp服务器, 获取文件test.json
String endpoint2 = "activemq:queue:cheese"; // 端点2:将文件发送到activemq的指定队列
from(endpoint1)
.to(endpoint2);
}
};
xml dsl 方式定义
<route>
<from uri="sftp:localhost:8081/folder/test.json"/> <!-- 端点1: 请求到sftp服务器, 获取文件test.json -->
<to uri="activemq:queue:cheese"/> <!-- 端点2: 将文件发送到activemq的指定队列 -->
</route>
3.Exchange Pooling
每个route的临时上下文对象, 仅在此route使用, 如果要使用全局变量,可以使用CamelContext
exchange-pooling官网链接
4. CamelContext
全局上下文对象
camelcontext官网链接
2. Routes 路由定义
// java dsl 方式定义
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("direct:a") // 从route.id = a来
.to("direct:b"); // 到route.id = b去
}
};
RouteBuilder builder = new RouteBuilder() {
public void configure() {
from("sftp:localhost/folder/test.json") // 请求到sftp服务器, 获取文件test.json
.to("activemq:queue:cheese"); // 将文件发送到activemq的指定队列
}
};
<!-- xml dsl 方式定义 -->
<route>
<from uri="direct:a"/> <!-- 从route.id = a来 -->
<to uri="direct:b"/> <!-- 到route.id = b去 -->
</route>
<route>
<from uri="sftp:localhost/folder/test.json"/> <!-- 请求到sftp服务器, 获取文件test.json -->
<to uri="activemq:queue:cheese"/> <!-- 将文件发送到activemq的指定队列 -->
</route>
# yaml dsl 方式定义
- route:
precondition: "'{{format}}' == 'xml'" # 前置条件, 当format == 'xml',才执行route
from:
uri: "direct:a"
steps:
- to: "direct:b"
5. step 官方手册链接
4. Apache Yaml DSL 语言扩展包, 支持导入yaml定义Route
定义yaml可使用的格式:【camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json】
下面的例子使用到如下类 :
(1)- route org.apache.camel.model.RouteDefinition
(2)steps org.apache.camel.model.ProcessorDefinition
(3)- to org.apache.camel.model.ToDefinition
(4) - from org.apache.camel.model.FromDefinition
(5)- log org.apache.camel.model.LogDefinition
例子:
# 定时器 起始路由流程
- route:
id: "START_TIMER"
group: "test_group"
from: zookeeper-master:SPLITPACKAGE_TIMER:quartz://SPLITPACKAGE_TIMER?cron=0+0/10+*+*+*+?
steps:
# 记录日志
- log:
message: "定时器开始: ${date:now:yyyy-MM-dd HH:mm:ss}"
# 路由指向 route = INIT_BEAN
- to: direct:INIT_BEAN
# bean初始化填充数值
- route:
id: "INIT_BEAN"
group: "test_group"
from: direct:SPLITPACKAGE_1
steps:
# 往exchange中设置上下文变量值, key = code, value = SPLIT_PACKAGE
- setProperty:
name: "code"
constant: "SPLIT_PACKAGE"
- setProperty:
name: "bodyName"
constant: "mainBody"
# 执行1: 调用指定springbean"CommonBean"的方法setGlobalProperty()
- to: bean:commonBean?method=setGlobalProperty
# 执行2: 路由到下一个步骤
- to: direct:SEND_SFTP_REQUEST
- route:
id: "SEND_SFTP_REQUEST"
group: "test_group"
from: direct:INIT_BEAN
steps:
# 发送sftp请求, 上传文件
- to: sftp://fjfclass@localhost:8022/sftp/upload?password=RAW(Class@2013_9)&binary=true&fileName=${header.fileName}
- to: direct: END_ROUTE
- route:
id: "END_ROUTE"
group: "test_group"
from: direct:SEND_SFTP_REQUEST
steps:
- to: bean:logUtils?method=generateLog