我有什么?
Spring Integration,递归观看新CSV文件的文件夹;并将它们发回Spring批次。
作业:阅读CSV文件;在处理器中,我修改了项目中的一些数据;然后我使用自定义编写器将数据保存在数据库中。
问题吗
事实上,我有动态数量的CSV beeing发送到批处理。我希望我的作业提交间隔将基于CSV文件中存在的项目(行)数量。换句话说,我不想在每个固定数量的项目中提交我的数据,而是在文件的每一端。例如:CSV 1有200行,我想处理所有行,写入,提交,关闭事务然后读取下一个CSV。
我有两个想法,但我不知道哪个是完美的,如何实现它:
#{jobParameters['commit.interval.value']}
isComplete()
您是否有任何例子? Github项目?但在此之前,我怎样才能获得物品数量?
任何人都可以帮助我吗?代码样本可能吗?
提前谢谢。
答案 0 :(得分:3)
没有答案,但我找到了解决方案
我正在使用动态提交间隔而不是完成政策。
使用Spring批量集成,我可以使用转换器将我的文件发送到批处理,因为我有一个自定义类FileMessageToJobRequest
,我添加了这个函数,帮助我获取计数行
public static int countLines(String filename) throws IOException {
InputStream is = new BufferedInputStream(new FileInputStream(filename));
try {
byte[] c = new byte[1024];
int count = 0;
int readChars = 0;
boolean empty = true;
while ((readChars = is.read(c)) != -1) {
empty = false;
for (int i = 0; i < readChars; ++i) {
if (c[i] == '\n') {
++count;
}
}
}
return (count == 0 && !empty) ? 1 : count;
} finally {
is.close();
}
}
和这一个发送参数
@Transformer
public JobLaunchRequest toRequest(Message<File> message) throws IOException{
JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
jobParametersBuilder.addString("commit.interval", Integer.toString(countLines(message.getPayload().getAbsolutePath())));
return new JobLaunchRequest(job, jobParametersBuilder.toJobParameters());
}
在我的工作环境中,我刚刚添加了这个commit-interval="#{jobParameters['commit.interval']}"
希望它可以帮助有需要的人;)