Apache Camel 代码示例

视频说明

Apache Camel 代码示例

https://github.com/ioufev/camel-spring-boot-demo

代码思路:定时任务模拟产生消息,发送给 MQTT 主题,MQTT 订阅主题收到消息后打印消息并写入文件。

演示了 crondirectbeanfile 等常见组件用法

项目结构说明

camel-spring--boot-demo/
├── src/
│   ├── main/
│   │   ├── java/com/ioufev/
│   │   │   ├── job/DeviceJob.java           # 模拟设备数据(如电压)
│   │   │   ├── service/SendService.java     # 接收 MQTT 消息并打印
│   │   │   ├── route/SendRoute.java         # 路由:direct:send → 业务服务
│   │   │   └── route/DemoRoute.java         # 核心路由:MQTT 发布/订阅
│   │   └── resources/
│   │       ├── application.yml              # MQTT 与 Camel 配置
│   │       └── ...
├── pom.xml                                  # Maven 项目定义文件
└── README.md                                # 项目说明文档(本文件)

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.18</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ioufev</groupId>
    <artifactId>camel-spring-boot-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>camel-spring-boot-demo</name>
    <description>camel-spring-boot-demo</description>

    <properties>
        <java.version>8</java.version>
        <camel.version>3.14.10</camel.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- Apache Camel BOM,统一管理依赖版本 -->
            <dependency>
                <groupId>org.apache.camel.springboot</groupId>
                <artifactId>camel-spring-boot-bom</artifactId>
                <version>${camel.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- ... other BOMs or dependencies ... -->
        </dependencies>
    </dependencyManagement>

    <dependencies>

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

        <!-- Camel 的 MQTT5 支持组件 -->
        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-paho-mqtt5-starter</artifactId>
        </dependency>

        <!-- Camel 的定时任务组件(基于 cron) -->
        <dependency>
            <groupId>org.apache.camel.springboot</groupId>
            <artifactId>camel-cron-starter</artifactId>
        </dependency>

        <!-- Lombok 简化开发 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.34</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.yml

spring:
  application:
    name: camel-spring-boot-demo

camel:
  springboot:
    main-run-controller: true # 保证 Camel 路由运行后不会自动退出

  component:
    direct:
      enabled: true # 启用 direct 路由组件
    paho-mqtt5:       # MQTT5 配置
      brokerUrl: tcp://127.0.0.1:1883
      qos: 0          # MQTT 消息质量等级(最多一次)
      user-name:
      password:

DeviceJob

package com.ioufev.job;

import org.springframework.context.annotation.Configuration;

/**
 * 模拟设备任务类
 * 提供一个生成电压数据的方法,供 Camel 定时调度时调用
 */
@Configuration
public class DeviceJob {
    public String voltage(){
        return "380";
    }
}

SendService

package com.ioufev.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * 用于打印 MQTT 消息内容,模拟业务处理逻辑
 */
@Slf4j
@Service
public class SendService {
    public void send(String message){
        log.info("消息{}", message); // 日志输出
        System.out.println("消息" + message); // 控制台输出
    }
}

SendRoute

package com.ioufev.route;

import com.ioufev.service.SendService;
import lombok.RequiredArgsConstructor;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.context.annotation.Configuration;

/**
 * SendRoute:处理 direct:send 路由的逻辑
 * 将消息交由 SendService 中的方法进行处理
 */
@RequiredArgsConstructor
@Configuration
public class SendRoute extends RouteBuilder {

    private final SendService sendService;

    @Override
    public void configure() throws Exception {
        from("direct:send") // 接收来自其他路由的消息
                .bean(sendService, "send"); // 调用 sendService.send() 方法处理消息
    }
}


DemoRoute

package com.ioufev.route;

import com.ioufev.job.DeviceJob;
import lombok.RequiredArgsConstructor;
import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.context.annotation.Configuration;

/**
 * DemoRoute:核心数据流路由
 * - 使用 cron 定时器生成电压数据并发布至 MQTT
 * - 订阅 MQTT 主题数据,写入文件和调用 sendService
 */
@RequiredArgsConstructor
@Configuration
public class DemoRoute extends RouteBuilder {

    private final CamelContext camelContext;
    private final DeviceJob deviceJob;

    @Override
    public void configure() throws Exception {
        String cron = "0/20 * * * * *"; // 每 20 秒执行一次

        // 路由 1:定时生成模拟数据并发布到 MQTT topic
        from("cron://myCron?schedule=" + cron)
                .routeId("genDeviceDataRoute")
                .bean(deviceJob, "voltage") // 获取电压值
                .to("paho-mqtt5:device1/voltage"); // 发布到 MQTT

        // 路由 2:订阅 MQTT 所有 device1/# 主题
        from("paho-mqtt5:device1/#")
                .routeId("mqtt5Route")
                .to("direct:send") // 调用 SendRoute 进行业务处理
                .process(exchange -> {
                    // 处理消息体,设置文件名和写入格式
                    String body = exchange.getIn().getBody(String.class);
                    exchange.getIn().setHeader("CamelFileName", "device1-" + System.currentTimeMillis() + ".txt");
                    exchange.getIn().setBody("[Message] " + body + "\n");
                })
                .to("file:E:\\data\\test?fileExist=Append"); // 追加写入文件
    }
}

posted @ 2025-07-21 21:30  ioufev  阅读(129)  评论(0)    收藏  举报