簡體   English   中英

從 REST 控制器調用 Apache Camel 路由

[英]Calling Apache Camel route from a REST controller

我有一份看起來像這樣的工作:

@Named
public class MyCamelRouteBuilder extends RouteBuilder {

    private static final String JOB_NAME = "abc";
    private static final String JOB_METHOD_NAME = "xyz";

    private final MyJob myJob;

    @Inject
    public MyCamelRouteBuilder(MyJob myJob) {
        super();
        this.myJob = myJob;
    }

    @Override
    public void configure() {
        fromF("direct:%s", JOB_NAME)
            .routeId(JOB_NAME)
            .bean(myJob, JOB_METHOD_NAME)
            .end();

        fromF("master:some_name_1/some_name_2:scheduler:%s?delay=%s", JOB_NAME, 1234)
            .routeId("JobTimer")
            .toF("direct:%s", JOB_NAME)
            .end();
    }
}

作業類的一個非常簡化的版本:

@Named
public class MyJob {

    private MyJob() {}
    }

    public void xyz() {

    }
}

這確實有效,並且確實按預期觸發。

問題從這里開始:

現在,我還想創建一個能夠觸發完全相同的作業的 REST 控制器。 像這樣的東西:

@Named
@RestController
@RequestMapping
@Validated
public class MyController {

    private static final String JOB_NAME = "abc";

    private final ProducerTemplate producerTemplate;

    @Inject
    public MyController(
            ProducerTemplate producerTemplate
    ) {

        this.producerTemplate = producerTemplate;
    }

    @PostMapping(path = "/my_endpoint")
    public String run() throws Exception {
        producerTemplate.requestBody("direct:" + JOB_NAME);
        return "ok";
    }
}

但是一旦到達這條線,就不會觸發作業,請求調用會一直掛起。

producerTemplate.requestBody("direct:" + JOB_NAME);

有任何想法嗎?

我的問題的解決方法:

@Named
@RestController
@RequestMapping
@Validated
public class MyController {
    private static final String JOB_NAME = "abc";

    @Produce("direct:" + JOB_NAME)
    private final ProducerTemplate producerTemplate;
    private final CamelContext context;

    @Inject
    public MyController(
            ProducerTemplate producerTemplate, CamelContext context
    ) {
        this.producerTemplate = producerTemplate;
        this.context = context;
    }

    @PostMapping(path = "/my_endpoint")
    public String run() throws Exception {

        Exchange exchange = new DefaultExchange(context);
        producerTemplate.send(exchange);

        return "ok";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM