Как добавить индексный номер в имя файла, записанное файловым компонентом Apache Camel? - PullRequest
0 голосов
/ 15 марта 2019

Я пытался придумать способ добавить индексный номер к файлу, написанному как компонент файла Apache Camel.

Вот пример использования: у вас есть файл, то есть «input.xml», и этот файл многократно записывается с различным содержимым в папку компонентом «file» Apache Camel. Таким образом, требуется добавить счетчик, чтобы каждый файл со встречным именем содержал такой счетчик, как «input-1.xml», «input-2.xml», «input-3.xml» и т. Д.

1 Ответ

1 голос
/ 15 марта 2019

Это не идеальное решение, но вы можете создать боб Camel с некоторым состоянием, которое на некоторое время запоминает, какие файлы прошли, и соответствующим образом нумерует их. Я предполагаю, что файлы, которые приходят через, имеют уникальные имена с течением времени.

Код боба:

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());
    }
}

Тогда вы можете просто использовать бин в своем маршруте следующим образом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...