You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何手动启动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字段

先给你指出原代码里的几个小问题:

  1. RouteBuilder的正确重写方法是configure(),不是setup();
  2. private final String comment = "Cron"末尾缺少分号;
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:50:30