Spring批处理~动态提交间隔或自定义完成策略
我有什么? Spring集成,递归监视新CSV文件的文件夹;然后把它们送回Spring batch 作业:读取CSV文件;在处理器中,我修改了项目中的一些数据;然后,我使用一个自定义编写器将数据保存在数据库上 问题? 事实上,我有动态的CSV发送到批。我希望我的作业提交间隔将基于CSV文件中存在的项目(行)数。换句话说,我不想在每个固定数量的项目中提交数据,而是在文件的每个结尾提交数据。示例:CSV1有200行,我想处理所有行,写入它们,提交,关闭事务,然后读取下一个CSV 我有两个想法,但我不知道谁是完美的,如何实现它:Spring批处理~动态提交间隔或自定义完成策略,spring,csv,spring-batch,Spring,Csv,Spring Batch,我有什么? Spring集成,递归监视新CSV文件的文件夹;然后把它们送回Spring batch 作业:读取CSV文件;在处理器中,我修改了项目中的一些数据;然后,我使用一个自定义编写器将数据保存在数据库上 问题? 事实上,我有动态的CSV发送到批。我希望我的作业提交间隔将基于CSV文件中存在的项目(行)数。换句话说,我不想在每个固定数量的项目中提交数据,而是在文件的每个结尾提交数据。示例:CSV1有200行,我想处理所有行,写入它们,提交,关闭事务,然后读取下一个CSV 我有两个想法,但我不
{jobParameters['commit.interval.value']}
isComplete()
您有任何示例吗?Github项目提前谢谢。没有回答,但我找到了解决办法 我使用的是动态提交间隔,而不是完成策略 通过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();
}
}
public static int countLines(字符串文件名)引发IOException{
InputStream is=new BufferedInputStream(new FileInputStream(filename));
试一试{
字节[]c=新字节[1024];
整数计数=0;
int readChars=0;
布尔空=真;
而((readChars=is.read(c))!=-1){
空=假;
for(int i=0;i
这个用来发送参数
@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());
}
变压器
public JobLaunchRequest toRequest(消息消息)引发IOException{
JobParametersBuilder JobParametersBuilder=新的JobParametersBuilder();
jobParametersBuilder.addString(“commit.interval”、Integer.toString(countLines(message.getPayload().getAbsolutePath()));
返回新的JobLaunchRequest(job,jobParametersBuilder.toJobParameters());
}
在我的作业上下文中,我刚刚添加了这个commit interval=“#{jobParameters['commit.interval']}”
希望它能帮助有需要的人;)