我一直在尝试提出一种将索引号附加到由Apache Camel文件组件编写的文件中的方法。
这里是用例:您有一个文件,即“ input.xml”,并且Apache Camel“文件”组件将此文件以不同的内容重复写入文件夹中。因此,要求添加一个计数器,以便每个具有冲突名称的文件都包含一个计数器,例如“ input-1.xml”,“ input-2.xml”,“ input-3.xml”等。>
答案 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