首页 > 解决方案 > 如何在 Apache Camel 文件组件编写的文件名中附加索引号?

问题描述

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

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

标签: javaapache-camel

解决方案


这不是一个完美的解决方案,但是您可以创建一个具有某种状态的 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

推荐阅读