Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Apache驼峰路由中的动态to()_Spring Boot_Apache Camel - Fatal编程技术网

Spring boot Apache驼峰路由中的动态to()

Spring boot Apache驼峰路由中的动态to(),spring-boot,apache-camel,Spring Boot,Apache Camel,我正在使用ApacheCamel编写一个演示程序。正在从Spring引导计划程序调用Out Camel路由,它将文件从源目录C:\CamelDemo\inputFolder传输到目标目录C:\CamelDemo\outputFolder Spring启动计划程序如下所示 @Component public class Scheduler { @Autowired private ProducerTemplate producerTemplate; @Scheduled

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

Spring启动计划程序如下所示

@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");
    }
}
@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(即givig静态端点)时,流正在工作。但当我对recipientList进行评论和取消注释时,它不起作用。请帮助如何将消息路由到动态端点OutpundPoint?

您正在使用PollRich,但未指定聚合策略:在这种情况下,Camel将从检索到的资源创建新的OUT消息,不将其与原始IN消息组合:这意味着您将丢失先前在IN消息上设置的头

见文件:

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");

当我在Exchange属性中设置outputEndpoint值并在recipientList中获取exchangeProperty时,它正在工作。