Apache Camel - 23 - Content Based Routing基于内容的路由

Apache Camel快速入门(中) 3-3、Processor 处理器 Camel中另一个重要的元素是Processor处理器,它用于接收从控制端点、路由选择条件又或者另一个处理器的Exchange中传来的消息信息,并进行处理。Camel核心包和各个Plugin组件都提供了很多Processor的实现,开发人员也可以通过实现org.apache.camel.Processor接口自定义处理器(后者是通常做法)。 既然是做编码,那么我们自然可以在自定义的Processor处理器中做很多事情。这些事情可能包括处理业务逻辑、建立数据库连接去做业 阅读详情

写在前面,这篇文章,暂时是Apache Camel学习的最后一篇,系列文章后期更新,自己也不知道是什么时候。

Apache Camel 学习的所有代码(完整、可运行)都提交到了GitHub上面;

需要的同学请自取:https://github.com/Simba-cheng/ApacheCamelDemo

如果你觉得还不错,请点star。

我把所有学习Apache Camel找的PDF都上传了,需要的同学自取:

《Mastering Apache Camel》

《Red_Hat_Fuse-7.0-Apache_Camel_Development_Guide-en-US》

《Apache Camel Developer's Cookbook》

 

Content Based Routing基于内容的路由

When you need to route messages based on the content of the message, and/or based on the headers or properties associated with the message, using Camel's Content Based Router EIP is a great way to do that.

Content Based Routing and Filtering are very similar.

A Content Based Router has multiple predicates, and the contained steps are performed on the firstpredicate that the message matches, or the optional otherwisestatement if none matches

(similar to an if () {..} else if () {..} else {..}statement in Java).

Camel's Filter EIP tests against a single predicate, executing the contained processing steps only if the message matches that predicate. The equivalent of a Filter in Java would be a single ifstatement.

当您需要根据消息内容或基于与消息相关联的标题或属性来路由消息时,使用Camel的基于内容的路由器EIP是一种很好的方法。

基于内容的路由和过滤非常相似。

基于内容的路由器具有多个谓词,并且包含的步骤在消息匹配的firstpredicate上执行,或者如果没有匹配则执行可选的其他语句

(类似于if(){..} else if(){..} else {..}语句在Java中)。

Camel的Filter EIP针对单个谓词进行测试,仅当消息与该谓词匹配时才执行包含的处理步骤。 Java中的Filter的等价物将是单个if语句。

当需要依据消息内容选择某个路由时,可以使用choice 和 when 构造。

这些与Java中的if/else非常相似,只不过,在Camel中,等价的是 choice和when

 

在Java中,是这样的:

if(...){

//do something

}else if(...){

//do something

}else{

//do something

}

在Camel DSL中,是这样的:

from(anEndpoint)

  .choice()

    .when(someCondition).to(firstEndpoint)

    .when(anotherCondition).to(secondEndpoint)

  .otherwise()

    .to(thirdEndpoint)

  .endChoice();

请注意:

我们开始使用choice() - 这告诉Camel以下行将包含一些判断条件。

每种when()方法具体需要判断的条件,类似于Java中if核心。

该方法otherwise()定义了当先前when()条件均不符合时要执行的操作。

该块以.endChoice()结尾。

 

 

当消息Body中包含特定字符串

关键路由代码:

from("jetty:http://0.0.0.0:8282/choiceCamel").process(new Process01())
	.choice()
	.when(body().contains("yuanbao")).process(new Process02())
	.when(body().contains("yinwenjie")).process(new Process03())
	.otherwise().process(new Process04())
	.endChoice();// 结束

测试结果:

服务端输出

客户端输出

 

将入参转换为对象,使用simple()方法进行判断

关键路由代码:

from("file:./simple?noop=true")
	.unmarshal().json(JsonLibrary.Jackson, Order.class)
	.choice()
	.when().simple("${body.type} == 'yuanbao'").process(new Process05())
	.when().simple("${body.type} == 'yinwenjie'").process(new Process06())
	.otherwise().process(new Process07())
	.endChoice();// 结束

测试输出结果:

 

使用JsonPath拦截http中携带的json信息,并判断

路由关键代码:

org.apache.camel.model.language.JsonPathExpression jsonPathExpression =
			new org.apache.camel.model.language.JsonPathExpression("$.data.orgId");
	
jsonPathExpression.setResultType(String.class);
LOGGER.info("jsonPathExpression : " + jsonPathExpression);

from("jetty:http://0.0.0.0:8282/choiceCamel").process(new Process01())
	// 将orgId属性的值存储 exchange in Message的header中,以便后续进行判断
	.setHeader("orgId", jsonPathExpression)
	.choice()
	.when(header("orgId").isEqualTo("yuanbao")).process(new Process02())
	.when(header("orgId").isEqualTo("yinwenjie")).process(new Process03())
	.otherwise().process(new Process04())
	.endChoice();// 结束

测试输出结果:

服务端输出结果

客户端输出结果:

 

使用file组件,检查接收的文件是否是指定的文件名

路由关键代码:

/**
 * 使用file组件,检查接收的文件名是否是指定的文件名
 * (不过,这个也可以用file组件中的filter属性来做(效率比这个好))
 */
from("file:./simple?noop=true")
	.unmarshal().json(JsonLibrary.Jackson, Order.class)
	.choice()
	.when(header("CamelFileName").isEqualTo("simple.json")).process(new Process05())
	.when(header("CamelFileName").isEqualTo("simple2.json")).process(new Process06())
	.otherwise().process(new Process07())
	.endChoice();// 结束

测试输出结果:

 

参考来源:

《Apache Camel Developer's Cookbook》

http://camel.apache.org/content-based-router.html

https://cleverbuilder.com/articles/camel-choice-when/

http://camel.apache.org/content-based-router.html

Apache Camel 学习 使用05 Apache Camel - 21 -将Camel嵌入到Spring应用中 使用Java DSL 代替 Spring XML DSL 使用Spring XML DSL 并不是强制的,也可以使用Java DSL 代替。 将fileRoutes以Bean的方式注入到camelContext上下文中。 当然,可以在camelContext中使用多个routeBuilder(路由)... 阅读详情

相关推荐

【Apache Camel】基础知识

通常应用程序中只有一个 CamelContext,但也可以同时存在多个 CamelContext,但多个 CamelContext 之间彼此需要隔离,如果要在多个 CamelContext 之间通信,则需要加入一个传输层(如消息队列)。Message 接口提供了单个消息的抽象表示,如请求消息、回复消息、异常消息。Routes 用于连接源 Endpoints 和目标 Endpoints,Routes 描述了消息从源 Endpoints 到目标 Endpoints 的移动过程。

又言又语 3407

apache camel 简单路由条件筛选

Camel中支持的路由规则非常丰富,包括:Message Filter、Based Router、Dynamic Router、Splitter、Aggregator、Resequencer等等。在Camel的官方文档中使用了非常形象化的图形来表示这些路由功能(http://camel.apache.org/enterprise-integration-patterns.html):   1、...

asd5629626的博客 4553

架构设计:系统间通信(36)——Apache Camel快速入门(上)

1、本专题主旨 1-1、关于技术组件 在这个专题中,我们介绍了相当数量技术组件:Flume、Kafka、Active...

3865

Apache Camel - 9 - Camel路由条件

Routing with Camel(Camel的路由) Apache Camel相关代码已经上传GitHub,需要的自取:GitHub - Apache Camel 完整Demo 如果觉得还行,麻烦点个Star   Oneof the most important features of Camel is routing; without it, Camel wouldessential...

Simba_cheng的博客 5305

【信息科学与工程学】计算机科学与自动化 第二百三十四篇 企业业务系统的架构01

以上10个编号(16-25)覆盖了自然语言处理、边缘计算、生物信息学、金融风控、云计算、社交网络、航天、教育、能源、游戏AI等领域。每个字段均提供了极其详细的内容,数学分析融合了离散数学、几何、拓扑、图论、测度论、代数、概率论、统计学、运筹学等多种学科。: 首先计算毛需求 (Gross Requirements, GR),然后减去现有库存 (On-Hand Inventory, OH) 和在途订单 (Scheduled Receipts, SR),加上安全库存 (Safety Stock, SS)。

weixin_49199313的博客 103

深入解析DDR5 RFM机制:从JESD79-5标准到硬件实现

本文深入解析了DDR5内存标准中的关键机制——RFM(Refresh Management)。文章从JESD79-5标准出发,详细阐述了RFM如何通过RAA计数器实现从被动定时到主动响应的智能刷新管理,并探讨了其硬件实现细节、命令调度挑战及系统级设计考量,为芯片设计工程师优化DDR5内存子系统性能与可靠性提供了实践指导。

fff88的博客 489

ssl_exporter告警实战:5条PromQL规则,提前7天精准抓住每张即将过期的证书

ssl_exporter 是一款 TLS 证书监控 Exporter,专门把证书过期时间导出为 Prometheus 指标,让你用 5 条 PromQL 告警规则提前 7 天发现并告警每一张即将过期的证书,从此告别“凌晨三点证书过期导致全站宕机”的惊魂时刻。 ## 🔑 为什么你需要证书过期告警 一张证书在凌晨悄悄过期,可能让客户端大面积拒绝连接,5xx 错误瞬间飙升。逐个登录服务器手动敲 `

gitblog_00599的博客 619

从ViT到CLIP:OpenAI如何用4亿张图‘教会’AI看懂世界?一次讲透对比学习与Prompt工程

本文深入解析OpenAI的CLIP模型如何通过4亿图文对的对比学习实现跨模态理解,详细探讨了对比学习、数据构建、模型架构及Prompt工程等核心技术。CLIP利用Transformer架构和精心设计的Prompt模板,在Zero-Shot分类、图像检索等场景展现出强大能力,为多模态AI应用开辟新方向。

weixin_27027459的博客 371

Apache Camel使用教程一

Apache Camel学习笔记:从入门到实践 本文记录了作者学习Apache Camel框架的过程,重点介绍了两个核心功能模块。第一部分通过一个HTTP请求处理的HelloWorld示例,展示了Camel的基本路由配置和消息交换处理流程。第二部分详细讲解了Choice组件,提供了多种条件路由判断的实现方式,包括从header读取值判断、从body内容判断、处理JSON文件内容判断以及根据文件名判断等场景。文中包含完整的代码示例,涉及HTTP请求处理、JSON数据提取和文件操作等常见集成场景,为初学者提供了

小石头的专栏 603

从mseed到SAC格式转换全攻略:mseed2sac工具安装与批量处理技巧

本文详细介绍了如何将mseed格式的地震数据高效转换为SAC格式,涵盖mseed2sac工具的安装、单文件转换技巧、批量处理自动化实现以及元数据高级处理策略。通过具体命令和脚本示例,帮助地震学研究者快速掌握数据预处理的关键技术,提升波形数据分析效率。

ruby5的博客 927

跟着团子学SAP CO:揭秘结果分析码在项目结算中的实战应用(一)KKA2/CJ88

本文深入解析了SAP CO模块中结果分析码在项目结算中的核心作用。以KKA2(方法10)和事务代码CJ88为例,详细阐述了如何在项目完工后一次性确认收入的场景下,通过结果分析功能实现收入与成本的精准匹配,将项目成本暂估为在制品,确保各期利润的准确反映。

gamma的博客 685

基于内容的路由器

基于内容的路由器首先检查消息的内容,并根据消息中包含的数据把消息路由到不同的通道上。可以根据许多标准来完成路由,如是否存在某些字段、是否有指定的字段值等。实现基于内容的路由器时,由于可能会频繁维护路由器,所以要特别注意路由功能应当易于维护。在更复杂的集成环境中,基于内容的路由器可能会以可配置规则引擎的形式出现,可以根据一组可配置的规则来计算目标通道。 背景: 假设一个公司销售配件(A)和零...

哈哈 540

RK3588零拷贝视频流水线实战:用GStreamer+Mpp实现8K硬解与DRM显示

本文深入探讨了在RK3588平台上构建零拷贝视频流水线的工程实践。通过结合GStreamer与MPP,实现了从8K视频硬解到DRM显示的全流程硬件加速,有效解决了高分辨率视频处理中的DDR带宽瓶颈问题。文章详细解析了dma-buf数据流机制、管道构建与性能优化策略,为多路视频并发处理提供了高效的系统架构解决方案。

github5actions的博客 1169

Debezium系列之:基于内容的路由

除了 Debezium 连接器在发生数据库更改时发出的更改事件消息外,连接器还会发出其他类型的消息,包括心跳消息以及关于架构更改和事务的元数据消息。由于这些其他消息的结构不同于 SMT 旨在处理的更改事件消息的结构,因此最好将连接器配置为有选择地应用 SMT,以便它仅处理预期的数据更改消息。当创建表达式来指定控制路由目标的条件时,SMT 可以查找并解释这些变量的值以评估表达式中的条件。根据评估事件的方式,SMT 将事件消息路由到原始目标主题,或将其重新路由到在表达式中指定的主题。

zhengzaifeidelushang的博客 1118

MEME-CHIP实战:5步搞定ChIP-seq数据中的motif发现与可视化

本文提供了使用MEME-CHIP工具进行ChIP-seq数据motif发现与可视化的完整实战指南。通过5个清晰步骤,从数据准备、环境搭建、命令行执行到结果解读与高级可视化,详细讲解了如何利用MEME-CHIP工作流高效完成从原始peak序列到发表级motif图的分析,并分享了关键的参数调优与避坑经验。

alice7model的博客 508

目标检测数据集 第059期-基于yolo标注格式的水果李子检测数据集(含免费分享)

李子作为中国三大水果之一,种植历史超 3000 年,在市场中占据重要地位。传统李子种植、施肥、采摘依赖大量人力,存在资源浪费、产量估算不准、采摘时机难把控等问题。此前,农业领域缺乏针对 “未成熟李子” 的专用数据集,现有水果检测数据集多聚焦于成熟果实(如苹果、柑橘),且未覆盖李子种植的复杂自然场景。在使用该数据集进行学术研究时,应遵守相关的学术规范,引用该数据集的来源,尊重数据集创作者的劳动成果。,用于训练改进型模型,解决李子精准检测的核心痛点。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 772

Apache Camel监控之使用hawtio

使用hawtio监控Apache Camel

夫礼者的专栏 4410

【异常】OpenClaw认证 Please carry the API secret key in the ‘Authorization‘ field of the request header

OpenClaw助手Agent因401认证异常导致业务中断的排查方案。该异常由大模型API鉴权全量失败触发,主要根因包括API凭证配置错误、密钥过期、账号权限不足或请求格式不规范。解决方案分四级:优先校验并修正API密钥;排查账号状态与调用权限;检查请求格式规范;最后排查网络或服务商问题。建议建立密钥生命周期管理机制,定期监控额度,使用专用API密钥以规避类似问题。该异常属于凭证配置类故障,不影响系统稳定性。

奶爸的编程之路,也就一周冷个三天 464

camel路由

camel路由需要注意的点:外面必须加上<choice>标签,否则不能根据条件选择when还是otherwise <choice> <when> </when> <otherwise> </otherwise> </choice> <routes xml...

qq_36594703的博客 569

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Apache Camel

Camel 是一个开源的集成框架,能够让开发者快速、轻松地整合/集成不同的应用/系统,并作为中间件在各种系统之间消费或生产数据。之所以Camel能在多种技术栈的系统之间快速集成,打通信息流,那是因为其拥有一个丰富的组件库,包含超过320个组件(核心和非核心的组件)。组件就像一个插头,允许系统连接到外部系统,比如邮箱、磁盘、FTP服务等等。这样通过组件可用于解决简单的消息传递和数据传输问题,而且还可以提供数据安全性,不需要开发者在系统架构的基础设施层反复地造轮子。

qq_31856061的博客 2055

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Apache Camel 路由

Apache Camel 路由

chenbj123的博客 1680

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Apache Camel笔记

Apache camel

weixin_42231601的博客 1479

Apache Camel简介

Apache Camel简介 整合不同系统是一项复杂且很有挑战的工作;如果有一个像拼图一样,把已有的拼图组件拼接起来,据此来整合各个系统,这样就会很简单。系统集成框架就是做这个事情的,使用起来不用关心待集成整合的系统是如何工作的,只专注于如何从外部与它们进行交互就行,一个好的集成框架就像是把各个复杂系统通过简单的、可管理的抽象且无缝地连接在一起的“胶水”,而Apache Camel就是这样一个集成框架。 1. 什么是Camel 1.1 来源 Camel项目开始于2007年初,虽然年轻,但它已经是一个成熟的开

chenbj123的博客 1万+

企业服务总线之Apache Camel 教程

企业服务总线之Apache Camel 教程 通过本教程学习 Apache Camel 的基础知识并在 Spring Boot 项目上创建您的第一个 Camel。

友莘居士的博客 6479

Camel框架的快速认识和使用

Camel框架的快速认识和使用   Camel流程框架是Apache下的一个开源项目,是较为成熟的流程框架。在web项目中也可以无缝地集成于Spring当中。   一、简单使用   引入camel相关的jar包:camel-core-2.10.4.jar。 1、经典的入门示例——文件移动     public class FileMoveWithCamel { ...

TuxedoLinux的博客 3750

Apache Camel核心概念

路由及数据转换

chenbj123的博客 2013
上一篇: Apache Camel - 22 - Controlling route startup and shutdown(Camel控制路由的启动/关闭顺序)
下一篇: HTTP - 01 - 概述
Simba_cheng
博客等级 码龄11年 250粉丝 203原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值