如何手动启动Camel路由?并通过Spring HTTP请求触发定时路由及修改字段
如何手动启动Camel路由并通过HTTP触发定时路由
咱们一步步来解决你的两个问题:
一、手动启动Camel路由的常见方法
默认情况下,Spring Boot集成Camel时,路由会随应用启动自动运行。如果要改成手动启动,或者在运行时按需触发,有两种常用方式:
设置路由延迟启动,通过API手动激活:
在你的CamelRoute类上添加autoStartup=false属性,这样应用启动时路由不会自动激活:@Component(autoStartup = "false") public class CamelRoute extends RouteBuilder { @Override public void configure() throws Exception { from("quartz2://myGroup/myTimerName?cron=0+0/5+12-18+?+*+MON-FRI") .routeId("myCronRoute") // 给路由设置唯一ID,方便后续定位操作 // ... 其他业务逻辑 } }之后在需要启动的地方(比如Controller、Service)注入
CamelContext,调用启动方法:camelContext.startRoute("myCronRoute");通过
ProducerTemplate直接触发路由逻辑:
这种方式更灵活,不需要启停整个路由,而是直接触发路由的业务逻辑。比如给路由新增一个direct端点,手动发送消息到这个端点就能执行对应逻辑,后面会结合你的HTTP需求详细说明。
二、通过HTTP请求手动触发定时路由并修改comment字段
先给你指出原代码里的几个小问题:
RouteBuilder的正确重写方法是configure(),不是setup();private final String comment = "Cron"末尾缺少分号;final修饰的comment无法修改,且HTTP请求是多线程环境,需要保证字段修改的线程安全。
下面是完整的改造方案:
1. 修改CamelRoute类
我们新增一个direct端点用于手动触发,同时用AtomicReference保证comment的线程安全:
import org.apache.camel.builder.RouteBuilder; import org.springframework.stereotype.Component; import java.util.concurrent.atomic.AtomicReference; @Component public class CamelRoute extends RouteBuilder { // 用AtomicReference保证多线程环境下的安全修改 private final AtomicReference<String> comment = new AtomicReference<>("Cron"); // 提供修改comment的方法 public void updateComment(String newComment) { this.comment.set(newComment); } // 获取当前comment public String getCurrentComment() { return comment.get(); } @Override public void configure() throws Exception { // 手动触发的端点 from("direct:manualTrigger") .routeId("manualTriggerRoute") .log("Processing from manual trigger") .process(exchange -> { // 将comment放入消息头,方便后续逻辑使用 exchange.getIn().setHeader("comment", comment.get()); }) .to("activemq:Totally.Rocks"); // 原来的定时路由,复用相同的处理逻辑 from("quartz2://myGroup/myTimerName?cron=0+0/5+12-18+?+*+MON-FRI") .routeId("scheduledCronRoute") .log("Processing from scheduled task") .process(exchange -> { exchange.getIn().setHeader("comment", comment.get()); }) .to("activemq:Totally.Rocks"); } }
2. 编写Spring HTTP接口
在Controller里注入CamelContext和CamelRoute,实现HTTP触发并修改comment:
import org.apache.camel.CamelContext; import org.apache.camel.ProducerTemplate; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/ex") public class RouteTriggerController { private final CamelContext camelContext; private final CamelRoute camelRoute; // 构造注入(Spring 4.3+支持) public RouteTriggerController(CamelContext camelContext, CamelRoute camelRoute) { this.camelContext = camelContext; this.camelRoute = camelRoute; } @GetMapping("/foos") public ResponseEntity<String> triggerRoute(@RequestParam(required = false) String comment) { try { // 如果传入了新的comment,更新字段 if (comment != null && !comment.isBlank()) { camelRoute.updateComment(comment); } // 发送消息到direct端点,触发路由执行 ProducerTemplate producerTemplate = camelContext.createProducerTemplate(); producerTemplate.sendBody("direct:manualTrigger", "Manual trigger via HTTP"); return ResponseEntity.ok(String.format("路由已手动触发!当前comment为:%s", camelRoute.getCurrentComment())); } catch (Exception e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("触发路由失败:" + e.getMessage()); } } }
3. 调用方式
启动应用后,你可以通过以下HTTP请求触发路由:
- 直接触发:
GET http://localhost:8080/ex/foos - 修改comment并触发:
GET http://localhost:8080/ex/foos?comment=ManualTrigger
这样既保留了原来的定时任务,又能通过HTTP手动触发,还能灵活修改comment字段~
内容的提问来源于stack exchange,提问作者Vitaly Anders
相关产品推荐
相关产品推荐

