Apache Camel笔记

2024-01-07 18:31:00

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 路由定义

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

文章来源:https://blog.csdn.net/weixin_42231601/article/details/135388469
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。