【问题标题】:Dynamic to() in Apache Camel RouteApache Camel Route 中的动态 to()
【发布时间】:2019-09-12 09:26:04
【问题描述】:

我正在使用 Apache Camel 编写一个演示程序。从 Spring Boot 调度程序调用 Out Camel 路由,它将文件从源目录 C:\CamelDemo\inputFolder 传输到目标目录 C:\CamelDemo\outputFolder

Spring Boot 调度器如下

@Component
public class Scheduler {

    @Autowired
    private ProducerTemplate producerTemplate;

    @Scheduled(cron = "#{@getCronValue}")
    public void scheduleJob() {
        System.out.println("Scheduler executing");
        String inputEndpoint = "file:C:\\CamelDemo\\inputFolder?noop=true&sendEmptyMessageWhenIdle=true";
        String outputEndpoint = "file:C:\\CamelDemo\\outputFolder?autoCreate=false";

        Map<String, Object> headerMap = new HashMap<String, Object>();
        headerMap.put("inputEndpoint", inputEndpoint);
        headerMap.put("outputEndpoint", outputEndpoint);

        producerTemplate.sendBodyAndHeaders("direct:transferFile", null, headerMap);
        System.out.println("Scheduler complete");
    }
}

Apache Camel 路由如下

@Component
public class FileTransferRoute extends RouteBuilder {

    @Override
    public void configure() {
        errorHandler(defaultErrorHandler()
            .maximumRedeliveries(3)
            .redeliverDelay(1000)
            .retryAttemptedLogLevel(LoggingLevel.WARN));

        from("direct:transferFile")
            .log("Route reached")
            .log("Input Endpoint: ${in.headers.inputEndpoint}")
            .log("Output Endpoint: ${in.headers.outputEndpoint}")
            .pollEnrich().simple("${in.headers.inputEndpoint}")
            .recipientList(header("outputEndpoint"));
            //.to("file:C:\\CamelDemo\\outputFolder?autoCreate=false")
    }
}

当我注释掉 recipientList() 的行并取消注释 to() 时,即在 to() 中添加静态端点,流程正在运行。但是当我评论 to() 并取消评论接收者列表() 时,它不起作用。请帮助如何将消息路由到动态端点(outputEndpoint)?

【问题讨论】:

  • 当我在 Exchange 的属性中设置 outputEndpoint 值并在接收者列表()中获取 exchangeProperty 时,它正在工作。

标签: spring-boot apache-camel


【解决方案1】:

您使用pollEnrich 而不指定AggregationStrategy:在这种情况下,Camel 将从检索到的资源中创建一个新的 OUT 消息,而不会将其与原始 IN 消息组合:这意味着您将丢失以前设置的标头在 IN 消息上。

查看文档:https://camel.apache.org/manual/latest/enrich-eip.html#_a_little_enrich_example_using_java

strategyRef 指的是用于将来自外部服务的回复合并到单个传出消息中的 AggregationStrategy。默认情况下,Camel 将使用来自外部服务的回复作为传出消息。

一个简单的解决方案是在您的pollEnrich 组件上定义一个简单的AggregationStrategy,它只是将标题从 IN 消息复制到新的 OUT 消息(请注意,您将使用原始 IN 消息正文,但在你的情况我猜这不是问题)

    from("direct:transferFile")
            .log("Route reached")
            .log("Input Endpoint: ${in.headers.inputEndpoint}")
            .log("Output Endpoint: ${in.headers.outputEndpoint}")
            .pollEnrich().simple("${in.headers.inputEndpoint}")
            .aggregationStrategy((oldExchange, newExchange) -> {
                // Copy all headers from IN message to the new OUT Message
                newExchange.getIn().getHeaders().putAll(oldExchange.getIn().getHeaders());
                return newExchange;
            })
            .log("Output Endpoint (after pollEnrich): ${in.headers.outputEndpoint}")
            .recipientList(header("outputEndpoint"));
            //.to("file:C:\\var\\CamelDemo\\outputFolder?autoCreate=false");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多