Spring boot Apache驼峰路由中的动态to()
我正在使用ApacheCamel编写一个演示程序。正在从Spring引导计划程序调用Out Camel路由,它将文件从源目录C:\CamelDemo\inputFolder传输到目标目录C:\CamelDemo\outputFolder Spring启动计划程序如下所示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
@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时,它正在工作。