使用Apache Camel文件组件传输文件

时间:2019-09-11 09:01:06

标签: spring spring-boot apache-camel

我正在尝试使用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也会被传输。请帮忙。

1 个答案:

答案 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")

能够使用动态端点。