Apache Camel 代码示例
Apache Camel 代码示例
https://github.com/ioufev/camel-spring-boot-demo
代码思路:定时任务模拟产生消息,发送给 MQTT 主题,MQTT 订阅主题收到消息后打印消息并写入文件。
演示了 cron、direct、bean、file 等常见组件用法
项目结构说明
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"); // 追加写入文件
}
}

浙公网安备 33010602011771号