Apache Camel 框架入门记录(二)

前一篇:Apache Camel 框架入门记录(一)

一、Camel消息处理器Processor

如果需要对传输的数据进行处理,则可以通过Processor接口实现消息处理器:

java 复制代码
public class MyProcessor implements Processor {
    // Processes the message exchange 
    // @param exchange the message exchange 
    // @throws Exception if an internal processing error has occurred.
    public void process(Exchange exchange) throws Exception { 
        // do something... 
    }
}

然后,可以在路由配置中调用此处理器:

java 复制代码
from("activemq:myQueue").process(new MyProcessor());

也可在注册表中注册此处理器,再通过Bean ID调用处理器。

如果处理逻辑较为简单,可以使用匿名类:

java 复制代码
    from("activemq:myQueue").process(new Processor() {
        public void process(Exchange exchange) throws Exception {
            String payload = exchange.getMessage().getBody(String.class);
            // do something with the payload and/or exchange here
           exchange.getMessage().setBody("Changed body");
       }
    }).to("activemq:myOtherQueue");

二、消息交换接口Exchange

在 Camel 中,请求消息及其对应的回复或异常消息通过Exchange接口来表示。

  • Exchange 内部包含 Message,可通过Exchange.getIn()获取。
    • Message是消息接口,包含信息如下:
      • body:消息体(即有效载荷 payload)
      • headers:携带附加信息的消息头
      • messageId:消息的唯一标识。默认情况下,消息使用与 Exchange.getExchangeId() 相同的 ID。
      • timestamp:消息的时间戳,即消息产生的时间。一些系统(如 JMS、Kafka、AWS)在事件或消息中自带时间戳。当 Camel 接收到这些消息时,如果存在时间戳,则该方法会返回该时间戳。
  • Exchange的生命周期贯穿整个路由,因此可以在Exchange保存重要数据数据(properties):
java 复制代码
Exchange.getProperty(String)
Exchange.setProperty(String, Object)

Camel还提供了简单表达式语言(SEL),用于处理简单的信息处理,这种语言支持使用${body}等占位符来表示动态表达式和函数,等价于Exchange.getIn():

java 复制代码
from("kafka:test,test1,test2?brokers=localhost:9092")
    .process(new MyProcessor())
    .log("Message received from Kafka : ${body}")
    .log("    on the topic ${headers[kafka.TOPIC]}")
相关推荐
无限大621 小时前
《AI观,观AI》:善用AI赋能|让AI成为你深耕核心、推进重心的“最强助手”
前端·后端
uzong21 小时前
CoPaw是什么?-- 2026年开源的国产个人AI助手
人工智能·后端
无心水1 天前
【任务调度:框架】11、分布式任务调度进阶:高可用、幂等性、性能优化三板斧
人工智能·分布式·后端·性能优化·架构·2025博客之星·分布式调度框架
pjw198809031 天前
Spring Framework 中文官方文档
java·后端·spring
盒马盒马1 天前
Rust:迭代器
开发语言·后端·rust
( •̀∀•́ )9201 天前
Spring Boot 启动报错 `BindException: Permission denied`
java·spring boot·后端
渔阳节度使1 天前
SpringAI实时监控+观测性
后端·python·flask
Victor3561 天前
MongoDB(42)如何使用$project阶段?
后端
Victor3561 天前
MongoDB(43)什么是嵌入式文档?
后端
Darkdreams1 天前
SpringBoot项目集成ONLYOFFICE
java·spring boot·后端