java - 如何在 Apache Camel 文件组件编写的文件名中附加索引号?
问题描述
我一直在尝试想出一种将索引号附加到编写为 Apache Camel 文件组件的文件的方法。
这是用例:您有一个文件,即“input.xml”,并且该文件由 Apache Camel“文件”组件以不同的内容重复写入文件夹。所以要求是附加一个计数器,以便每个具有冲突名称的文件都包含一个计数器,例如“input-1.xml”、“input-2.xml”、“input-3.xml”等。
解决方案
这不是一个完美的解决方案,但是您可以创建一个具有某种状态的 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
推荐阅读
- pandas - 查找最受欢迎的组合
- android - rxjava2 和 rxkotlin 有什么区别?
- r - 将 R 代码转换为 MATLAB 代码:卡在 sapply()
- javascript - 如何在 React 组件中渲染状态数组。该数组在状态下可用,但在呈现其显示未定义时
- php - 在 Laravel 中找不到页面,路由问题
- sql - 为什么我的每周代码与每周代码的结果不同?
- javascript - HTML 动态 data-ng-click 功能不起作用
- cordova - 科尔多瓦的“恢复和保存状态”?
- javascript - 在 chromev73 中阻止 jaavscript 时,我看到空白页而不是呈现网页
- c - 打开 FIFO 以及写入/读取 FIFO 的超时