如何在由Apache Camel文件组件编写的文件名中附加索引号?

时间:2019-03-15 16:41:17

标签: java apache-camel

我一直在尝试提出一种将索引号附加到由Apache Camel文件组件编写的文件中的方法。

这里是用例:您有一个文件,即“ input.xml”,并且Apache Camel“文件”组件将此文件以不同的内容重复写入文件夹中。因此,要求添加一个计数器,以便每个具有冲突名称的文件都包含一个计数器,例如“ input-1.xml”,“ input-2.xml”,“ input-3.xml”等。

1 个答案:

答案 0 :(得分:1)

这不是一个完美的解决方案,但是您可以创建一个带有某种状态的Camel bean,该状态可以记住一段时间后文件通过并对其进行相应编号。我的假设是,经过的文件随时间推移具有唯一的名称。

bean代码:

import org.apache.camel.Exchange;
import org.apache.camel.Message;

import java.util.Map;
import java.util.WeakHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Bean used to change the name of an output file with a counter.
 */
public class NameChangeBean {

    private static final Pattern NORMAL_FILE_PATTERN = Pattern.compile("(.+)(\\..+)");

    private Map<String, Integer> counter = new WeakHashMap<>();

    public void changeName(Exchange exchange) {
        Message in = exchange.getIn();
        String fileName = (String) in.getHeader(Exchange.FILE_NAME);
        Message out = exchange.getOut();
        out.setHeaders(in.getHeaders());
        if (fileName != null) {
            // Increase count by one or start at one
            Integer newNumber = counter.merge(fileName, 1, Integer::sum);
            Matcher matcher = NORMAL_FILE_PATTERN.matcher(fileName);
            if (matcher.matches()) {
                out.setHeader(Exchange.FILE_NAME, matcher.replaceFirst("$1-" + newNumber + "$2"));
            } else {
                out.setHeader(Exchange.FILE_NAME, String.format("%s-%d", fileName, counter.merge(fileName, 1, Integer::sum)));
            }
        }
        out.setBody(in.getBody());
    }
}

然后,您可以像这样简单地在路由中使用bean:

import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.main.Main;

public class FileWriteChangeNameRoute {

    public static void main(String[] args) throws Exception {

        Main main = new Main();

        System.out.println(javax.jms.ConnectionFactory.class);

        main.addRouteBuilder(new RouteBuilder() {

            public void configure() {
                from("file://D:/dev/playground/camel-activemq/src/data")
                        .bean(new NameChangeBean(), "changeName")
                        .to("file://D:/dev/playground/camel-activemq/src/data_out");
            }
        });

        main.run();
    }
}

这将对重复的文件名产生编号的文件版本,例如:

input.xsd-1.xml
input.xsd-2.xml
input.xsd-3.xml