Spring batch spring批处理作业执行的资源列表

Spring batch spring批处理作业执行的资源列表,spring-batch,Spring Batch,我需要通过spring批处理作业执行来处理平面文件。我从文件夹中获取需要处理的文件列表。请让我知道如何做到这一点 例如: 我的文件夹中有player.csv和player1.csv和player2.csv。我在列表中有这些文件名。请让我知道我是否可以为Jobparameters输入所有这些文件名,以便执行单个作业 JobParameters jobParameters = new JobParametersBuilder().addString("input.file", "file:playe

我需要通过spring批处理作业执行来处理平面文件。我从文件夹中获取需要处理的文件列表。请让我知道如何做到这一点

例如:
我的文件夹中有
player.csv
player1.csv
player2.csv
。我在列表中有这些文件名。请让我知道我是否可以为Jobparameters输入所有这些文件名,以便执行单个作业

JobParameters jobParameters = new JobParametersBuilder().addString("input.file", "file:player.csv").toJobParameters();
JobExecution execution = jobLauncher.run(job,jobParameters);
assertEquals(ExitStatus.COMPLETED, execution.getExitStatus());

有几种方法可以做到这一点; 1.创建一个作业,一次处理一个文件,让作业发起人迭代这些文件并触发作业,一次只传递一个文件 2.在作业中创建一个“循环”,以检查值并处理每个文件

下面是后一种选择的示例

首先是作业配置—它使用决策器为要处理的文件构建执行上下文值。如果没有更多文件(来自jobParameter),则它将完成

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:batch="http://www.springframework.org/schema/batch"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd">

    <batch:job id="multipleFileProcess">
        <batch:decision decider="decider" id="multipleFileProcess.decider">
            <batch:next on="UNKNOWN" to="multipleFileProcess.step1"/>
            <batch:end on="COMPLETED"/>
        </batch:decision>
        <batch:step id="multipleFileProcess.step1" next="multipleFileProcess.decider">
            <batch:tasklet>
                <batch:chunk reader="fileReader" writer="outWriter" commit-interval="10"/>
            </batch:tasklet>
        </batch:step>
        <batch:validator>
            <bean class="org.springframework.batch.core.job.DefaultJobParametersValidator">
                <property name="requiredKeys" value="input.files"/>
            </bean>         
        </batch:validator>
    </batch:job>


    <bean id="fileReader"
        class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
        <property name="lineMapper" ref="lineMapper"/>
        <property name="resource" value="file:#{jobExecutionContext['input.file']}"/>
    </bean>

    <bean id="lineMapper"
        class="org.springframework.batch.item.file.mapping.PassThroughLineMapper"/>


    <bean id="transactionManager"
        class="org.springframework.batch.support.transaction.ResourcelessTransactionManager">
    </bean>

    <bean id="decider" class="de.incompleteco.spring.batch.decider.FileDecision"/>

    <bean id="outWriter" class="de.incompleteco.spring.batch.item.writer.SystemOutItemWriter"/>

</beans>

以下是判定代码(使用内部队列-在执行上下文中将此“队列”作为字符串维护可能更安全,您可以慢慢缩短它(手动“弹出”字符串条目-但为了快速起见,使用队列)

package de.incompleteco.spring.batch.decider;
导入java.util.array;
导入java.util.Queue;
导入java.util.concurrent.LinkedBlockingQueue;
导入org.springframework.batch.core.JobExecution;
导入org.springframework.batch.core.StepExecution;
导入org.springframework.batch.core.job.flow.FlowExecutionStatus;
导入org.springframework.batch.core.job.flow.JobExecutionDecider;
公共类FileDecision实现JobExecutionDecisor{
公共静态最终字符串输入\u FILE=“INPUT.FILE”;
公共静态最终字符串输入\u FILES=“INPUT.FILES”;
公共静态最终字符串分隔符=“,”;
专用队列输入文件;
@凌驾
public FlowExecutionStatus Decision(作业执行作业执行,步骤执行步骤执行){
//检查jobExecution是否在其上下文中包含input.file
如果(!jobExecution.getExecutionContext().containsKey(输入文件)){
//构建队列
inputFiles=new LinkedBlockingQueue(Arrays.asList(jobExecution.getJobParameters().getString(INPUT_文件).split(分隔符));
}//如果结束
//弹出并添加
String file=inputFiles.poll();
如果(文件!=null){
jobExecution.getExecutionContext().put(输入文件,文件);
返回FlowExecutionStatus.UNKNOWN;
}//如果结束
//返回“完成”
返回FlowExecutionStatus.COMPLETED;
}
}
这是一个虚拟的“writer”,它将文件显示为“writed”

package de.incompleteco.spring.batch.item.writer;

import java.util.List;

import org.springframework.batch.item.ItemWriter;

public class SystemOutItemWriter implements ItemWriter<String> {

    @Override
    public void write(List<? extends String> items) throws Exception {
        for (String item : items) {
            System.out.println("this is what was received:" + item);
        }//end for
    }

}
package de.incompleteco.spring.batch.item.writer;
导入java.util.List;
导入org.springframework.batch.item.ItemWriter;
公共类SystemOutItemWriter实现ItemWriter{
@凌驾
公共空白写入(列表)
package de.incompleteco.spring.batch.item.writer;

import java.util.List;

import org.springframework.batch.item.ItemWriter;

public class SystemOutItemWriter implements ItemWriter<String> {

    @Override
    public void write(List<? extends String> items) throws Exception {
        for (String item : items) {
            System.out.println("this is what was received:" + item);
        }//end for
    }

}
package de.incompleteco.spring.batch;

import static org.junit.Assert.assertFalse;

import java.io.File;
import java.io.FileWriter;

import javax.annotation.Resource;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import de.incompleteco.spring.batch.decider.FileDecision;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/META-INF/spring/*-context.xml")
public class MultipleFileProcessIntegrationTest {

    @Rule
    public TemporaryFolder folder = new TemporaryFolder();

    @Resource
    private Job job;

    @Resource
    private JobLauncher jobLauncher;

    @Resource
    private JobExplorer jobExplorer;

    @Test
    public void test() throws Exception {
        //somewhere to hold the filenames
        StringBuilder builder = new StringBuilder();
        //create 3 files
        for (int i=0;i<3;i++) {
            File file = folder.newFile("testfile" + i + ".txt");
            //write some content
            FileWriter writer = new FileWriter(file);
            writer.write("test content: " + i);
            writer.flush();
            writer.close();
            //add the filename
            if (i > 0) {
                builder.append(FileDecision.DELIMITER);
            }//end if
            builder.append(file.getAbsolutePath());
            //show it
            System.out.println(file.getAbsolutePath());
        }//end loop


        //now build the job parameters
        JobParameters parameters = new JobParametersBuilder().addString(FileDecision.INPUT_FILES,builder.toString()).toJobParameters();
        //execution
        JobExecution execution = jobLauncher.run(job,parameters);
        //check
        while (jobExplorer.getJobExecution(execution.getId()).isRunning()) {
            Thread.sleep(100);
        }//end while
        //load
        execution = jobExplorer.getJobExecution(execution.getId());
        //check
        assertFalse(execution.getStatus().isUnsuccessful());
    }

}