Apache Camel 框架入门记录(一)

一、关于Apache Camel

Apache Camel 是一个开源集成框架,旨在简化系统集成,提供基于规则的路由和中介引擎。 因此通过camel框架可以轻松处理各系统之间的数据传递。

二、Camel中的概念

  • Endpoint(端点):数据的来源和去向。
  • Route(路由):定义了消息从源到目的地的流动路径。
  • Exchange(交换对象):Camel 内部的数据载体。
  • Processor(处理器):用于处理消息逻辑。

三、SpringBoot集成Camel框架

首先,将 Camel Core 和 Spring Boot Starter 模块添加到 Mavenpom.xml文件中:

xml 复制代码
    <!-- Spring Boot Starter模块 -->
    <dependency>
        <groupId>org.apache.camel.springboot</groupId>
        <artifactId>camel-spring-boot-starter</artifactId>
        <version>${camel.version}</version> <!-- use the same version as your Camel core version -->
    </dependency>
    <!-- Camel Core -->
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-core</artifactId>
        <version>3.14.0</version>
    </dependency>

然后就可以在 Camel 路由中添加类,例如:

java 复制代码
package com.example;

import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;

@Component
public class MyRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from("timer:foo").to("log:bar");
    }
}

如果需要Camel支持其他中间件(如kafka等)消息传递,可以引入Camel组件,引入方法和URI配置方法参考Camel组件文档,例如需要Camel支持Kafka消息就需要引入Kafka组件:

xml 复制代码
<dependency> 
    <groupId>org.apache.camel</groupId> 
    <artifactId>camel-kafka</artifactId> 
    <version>x.x.x</version> 
    <!-- use the same version as your Camel core version --> 
</dependency>

四、Spring boot 中的Camel路由配置

1、路由

Apache Camel 提供了一种基于 Java 的领域特定语言 (DSL),可以通过继承RouteBuilder并实现configure方法来创建路由。以下是Camel官方给出的路由示例:

java 复制代码
@Override
public void configure() { 
    // here is a sample which processes the input files 
    // (leaving them in place - see the 'noop' flag) 
    // then performs content based routing on the message using XPath
    from("file:src/data?noop=true") 
        .choice() 
            .when(xpath("/person/city = 'London'")) 
                .to("file:target/messages/uk") 
            .otherwise() 
                .to("file:target/messages/others"); 
}
  • from("file:src/data?noop=true")表示了路由的起点,在上面的例子中,我们只有一个路线,用于收集文件。
  • .choice用于标明后续会根据内容选择不同分支
    • .when类似于if,填写条件
    • .otherwise类似于else
  • .to表示路由的终点。

Camel 支持Gregor Hohpe 和 Bobby Woolf 在其优秀著作中介绍的大部分企业集成模式,针对不同消息传递模式,路由配置也不相同,详细参考Camel组件中的Enterprise Integration Patterns

2、URI

Camel 使用 URI标明端点信息,以kafka为例:

java 复制代码
kafka:cheese?brokers=127.0.0.1:9092&clientId=foo
  • cheese是kafka使用的主题
  • brokers是要连接的远程 Kafka 代理,它是 Kafka 组件的一个配置项
  • clientId客户端 ID,它也是 Kafka 组件的一个配置项

实际上kafka URI的可配置参数很多,其他配置参数和其他中间件的配置方法可参考Camel组件文档

如果端点URI非常长,可以通过Java 文本块来声明它们:

java 复制代码
from(""" 
        debezium-postgres:customerEvents 
        ?databasePassword={{myPassword}} 
        &databaseDbname=myDB 
        &databaseHostname=myHost 
        &pollIntervalMs=2000 
        &queryFetchSize=100 
    """) 
    .to("kafka:cheese");

或者自行编写URI创建函数:

java 复制代码
public String generateUrl(String topic,
                          String brokers,
                          String groupId,
                          String autoOffsetReset,
                          String keyDeserializer,
                          String valueDeserializer
    StringBuilder sb = new StringBuilder();
    sb.append("kafka:").append(topic).append("?");
    sb.append("brokers=").append(brokers).append("&");
    sb.append("groupId=").append(groupId).append("&");
    sb.append("autoOffsetReset=").append(autoOffsetReset).append("&");
    sb.append("keyDeserializer=").append(keyDeserializer).append("&");
    sb.append("valueDeserializer=").append(valueDeserializer).append("&");
    return sb.toString();
}
相关推荐
无心水36 分钟前
【文档解析】4、跨平台文档解析:JS/Go/C#全攻略
javascript·后端·golang·c#·架构师·大数据分析·分布式系统利器
清汤饺子42 分钟前
用了大半年 Claude Code,我总结了 16 个实用技巧
前端·javascript·后端
ん贤4 小时前
Go channel 深入解析
开发语言·后端·golang
changhong19867 小时前
如何在 Spring Boot 中配置数据库?
数据库·spring boot·后端
月月玩代码9 小时前
Actuator,Spring Boot应用监控与管理端点!
java·spring boot·后端
XPoet10 小时前
AI 编程工程化:Skill——给你的 AI 员工装上技能包
前端·后端·ai编程
码事漫谈10 小时前
从“功能实现”到“深度优化”:金仓数据库连接条件下推技术的演进之路
后端
码事漫谈10 小时前
数据库查询优化中的谓词下推策略与成本感知优化实践
后端
Amour恋空10 小时前
SpringBoot+Lombok+Logback实现日志
spring boot·后端·logback
廋到被风吹走11 小时前
【LangChain4j】特点功能及使用场景
后端·python·flask