易君召
易君召
发布于 2026-07-13 / 8 阅读
0
0

Spring Boot项目接入Apache Camel的保姆级操作教程与示例代码

一、版本兼容说明

接入前需注意版本对应关系,避免启动异常:

  • Apache Camel 4.x → Spring Boot 3.x(要求 Java 17+)

  • Apache Camel 3.x → Spring Boot 2.x(支持 Java 8+)

下文以 Spring Boot 3.2.x + Apache Camel 4.4.0 为例,覆盖核心接入流程与常用场景示例。

二、核心接入步骤

步骤 1:引入 Maven 依赖

pom.xml 中引入 Camel 核心启动器与业务所需组件的启动器,Camel 提供 300 + 组件,按需引入即可:

<dependencies>
    <!-- Spring Boot Web 基础(若无需HTTP接口可换成spring-boot-starter) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Apache Camel Spring Boot 核心启动器 -->
    <dependency>
        <groupId>org.apache.camel.springboot</groupId>
        <artifactId>camel-spring-boot-starter</artifactId>
        <version>4.4.0</version>
    </dependency>

    <!-- 组件:定时器 -->
    <dependency>
        <groupId>org.apache.camel.springboot</groupId>
        <artifactId>camel-timer-spring-boot-starter</artifactId>
        <version>4.4.0</version>
    </dependency>

    <!-- 组件:REST接口 -->
    <dependency>
        <groupId>org.apache.camel.springboot</groupId>
        <artifactId>camel-rest-spring-boot-starter</artifactId>
        <version>4.4.0</version>
    </dependency>

    <!-- 组件:Servlet(承载REST HTTP服务,复用Spring Boot容器) -->
    <dependency>
        <groupId>org.apache.camel.springboot</groupId>
        <artifactId>camel-servlet-spring-boot-starter</artifactId>
        <version>4.4.0</version>
    </dependency>
</dependencies>

步骤 2:基础配置(application.yml)

配置 Camel 上下文、Servlet 映射等基础参数:

server:
  port: 8080

camel:
  springboot:
    name: CustomCamelContext  # Camel上下文名称
    main-run-controller: true # 非Web项目必须开启,保持进程不退出
  servlet:
    mapping:
      context-path: /camel/*  # Camel HTTP接口的访问前缀

步骤 3:自定义路由(核心)

Camel 的核心是路由(Route),通过继承 RouteBuilder 并重写 configure 方法定义流转规则;类上加 @Component 注解后,Spring 会自动扫描并注册到 Camel 上下文中。

示例 1:定时日志路由

每 5 秒触发一次,输出带时间戳的日志:

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

@Component
public class TimerLogRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        // from: 路由起点(定时器端点)
        from("timer:helloTimer?period=5000")
                .setBody().constant("Hello Camel + Spring Boot")
                .setHeader("timestamp", simple("${date:now:yyyy-MM-dd HH:mm:ss}"))
                // to: 路由终点(日志端点)
                .to("log:timerLogger?level=INFO&showHeaders=true");
    }
}
示例 2:REST 接口路由

提供 HTTP GET 接口,自动返回 JSON 格式数据:

import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.rest.RestBindingMode;
import org.springframework.stereotype.Component;
import java.util.Map;

@Component
public class RestApiRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        // REST全局配置:Servlet承载、自动JSON绑定
        restConfiguration()
                .component("servlet")
                .contextPath("/camel")
                .port(8080)
                .bindingMode(RestBindingMode.json);

        // 定义REST接口:GET /camel/api/hello
        rest("/api")
                .get("/hello")
                .to("direct:helloHandler");

        // 接口业务逻辑
        from("direct:helloHandler")
                .setBody().constant(Map.of(
                        "code", 200,
                        "msg", "success",
                        "data", "Hello from Camel REST API"
                ));
    }
}
示例 3:文件搬运路由

监听指定目录,自动将文件从源目录移动到目标目录:

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

@Component
public class FileTransferRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        // 监听 ./data/input 目录,文件移动到 ./data/output
        from("file:./data/input?noop=false")
                .log("接收到文件: ${header.CamelFileName}")
                .to("file:./data/output");
    }
}

步骤 4:Spring Boot 启动类

无需额外配置,标准 Spring Boot 启动类即可,Camel 会自动装配上下文与路由:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CamelDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(CamelDemoApplication.class, args);
    }
}

步骤 5:效果验证

  1. 启动应用,控制台每 5 秒会输出定时日志;

  2. 访问 http://localhost:8080/camel/api/hello,可接收到 JSON 响应;

  3. 在项目根目录创建 data/input 文件夹并放入文件,文件会自动移动到 data/output 目录。

三、进阶常用场景

1. 调用 Spring 业务 Bean

在路由中直接调用 Spring 管理的 Service:

// 业务Bean
@Service("userService")
public class UserService {
    public Map<String, Object> getUserById(Integer id) {
        return Map.of("id", id, "name", "张三", "age", 25);
    }
}

// 路由中调用
rest("/api/user")
    .get("/{id}")
    .to("direct:getUser");

from("direct:getUser")
    .bean("userService", "getUserById(${header.id})")
    .log("查询结果: ${body}");

2. 全局异常处理

通过 onException 统一处理路由异常:

@Override
public void configure() throws Exception {
    // 全局异常捕获
    onException(Exception.class)
            .handled(true) // 标记异常已处理,不再向上抛出
            .log("路由异常: ${exception.message}")
            .setBody().constant(Map.of("code", 500, "msg", "系统内部异常"));

    // 测试接口
    rest("/api/error")
            .get("/test")
            .to("direct:errorTest");

    from("direct:errorTest")
            .throwException(new RuntimeException("模拟业务异常"));
}

3. 配置化参数注入

通过 @Value 将配置文件参数注入路由:

@Component
public class ConfigRoute extends RouteBuilder {

    @Value("${camel.timer.period:3000}")
    private long timerPeriod;

    @Override
    public void configure() throws Exception {
        from("timer:configTimer?period=" + timerPeriod)
                .setBody().constant("配置化定时任务")
                .to("log:configLogger");
    }
}

四、关键说明

  1. 自动装配camel-spring-boot-starter 会自动创建 CamelContext,并扫描所有 RouteBuilder 类型的 Spring Bean 完成路由注册;

  2. 组件扩展:所有 Camel 组件均有对应的 Spring Boot Starter,命名格式为 camel-xxx-spring-boot-starter

  3. 生命周期:Camel 上下文与 Spring 应用上下文同步启停,无需手动管理。


原文链接 https://www.yijunzhao.cn/archives/spring-boot-apache-camel-tutorial-guide-example-code

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/


评论