基于Camel-Quartz2与Spring Boot的调度配置问题求助
解决Camel + Quartz2调度器启动错误及路由配置问题
首先看你遇到的核心错误:No component found with scheme: quartz2,这是因为你的camel-quartz2依赖设置了<scope>test</scope>,这个依赖范围只会在测试代码执行时生效,服务器运行时根本加载不到quartz2组件,这是最关键的问题。
第一步:修复依赖配置
把camel-quartz2的scope改成compile(或者直接删除scope标签,默认就是compile),同时注意camel-spring-boot-dependencies作为BOM依赖,需要加上<type>pom</type>和<scope>import</scope>,否则依赖管理不会生效:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-quartz2</artifactId> <version>2.19.2</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-spring-boot-dependencies</artifactId> <version>2.19.2</version> <type>pom</type> <scope>import</scope> </dependency>
第二步:修正路由配置错误
你写的路由里有两个连续的from(),这在Camel里是不允许的——一个路由只能有一个入口点。结合你的需求(仅在特定时间段读取队列消息),有两种常见的实现方案:
方案1:定时触发读取队列(适合周期性拉取)
用quartz2作为定时触发器,每隔指定时间(你的cron是周一到周五13-15点每秒触发一次)去队列拉取消息,处理后交给bean:
from("quartz2://simpleTimer?cron=0/1+0+13-15+?+*+MON-FRI") .log("Reading msgs") .pollEnrich("some queue") // 从队列拉取一条消息,可配置批量拉取参数 .bean("myBean");
方案2:定时启停队列消费路由(适合持续消费时间段内的消息)
如果希望在13-15点期间持续监听队列,其他时间停止消费,可以用控制总线(ControlBus)结合quartz2来启停路由:
// 定义队列消费路由,初始状态为停止 from("some queue") .routeId("queueConsumerRoute") .autoStartup(false) // 启动时不自动激活 .log("Reading msgs") .bean("myBean"); // 每天周一到周五13:00启动队列消费路由 from("quartz2://startQueueRoute?cron=0+0+13+?+*+MON-FRI") .to("controlbus:route?routeId=queueConsumerRoute&action=start"); // 每天周一到周五15:00停止队列消费路由 from("quartz2://stopQueueRoute?cron=0+0+15+?+*+MON-FRI") .to("controlbus:route?routeId=queueConsumerRoute&action=stop");
关于simpleTimer和Cron的疑问
你完全可以把simpleTimer作为触发器的名称,同时搭配cron参数使用——这个名称只是quartz触发器的标识,不影响cron表达式的生效。quartz2组件会根据你提供的cron参数自动创建CronTrigger,而不是SimpleTrigger,所以不用担心冲突。
内容的提问来源于stack exchange,提问作者JKWGL
相关产品推荐
相关产品推荐

