我正在尝试使用Spring Boot和Apache Camel文件组件的演示文件传输程序。我已经公开了使用Spring Boot的REST控制器,该控制器正在调用Apache Camel路由,并且正在执行文件传输。我在目录C:\ CamelDemo \ inputFolder中有三个文件,分别是input1.txt,input2.txt和input3.txt。我只想在输出文件夹中传输文件input2.txt。我的Spring Boot控制器如下:
package com.example.demo.controller;
import java.util.HashMap;
import java.util.Map;
import org.apache.camel.ProducerTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/camel")
public class FileTransferController {
@Autowired private ProducerTemplate producerTemplate;
@RequestMapping(value="/file", method=RequestMethod.GET)
public String callCamelRoute() {
String fileName = "input2.txt";
Map<String, Object> headerMap = new HashMap<String, Object>();
headerMap.put("fileName", fileName);
producerTemplate.sendBodyAndHeaders("direct:transferFile", null, headerMap);
return "Route invoked";
}
}
我的路线如下:
package com.example.demo.route;
import org.apache.camel.LoggingLevel;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
@Component
public class FileTransferRoute extends RouteBuilder {
@SuppressWarnings("deprecation")
@Override
public void configure() {
errorHandler(defaultErrorHandler()
.maximumRedeliveries(3)
.redeliverDelay(1000)
.retryAttemptedLogLevel(LoggingLevel.WARN));
from("direct:transferFile")
.log("Route reached")
.log("file:C:\\CamelDemo\\inputFolder?fileName=${in.headers.fileName}&noop=true")
.pollEnrich("file://C:/CamelDemo/inputFolder?fileName=${in.headers.fileName}&noop=true")
.to("file://C:/CamelDemo/outputFolder?autoCreate=false")
.end();
}
}
但是,当我第一次指定此路由时,即使我已经指定了fileName参数,文件input1.txt也会被传输。请帮忙。
答案 0 :(得分:0)
我认为问题在于未设置文件名,因为您没有告诉Camel您使用的是Simple表达式,而不是固定的URI。
查看手册(https://camel.apache.org/manual/latest/pollEnrich-eip.html#_using_dynamic_uris),这意味着您将需要
.pollEnrich().simple("file://C:/CamelDemo/inputFolder?fileName=${in.headers.fileName}&noop=true")
能够使用动态端点。