传递作业参数到自定义编写器Spring批处理

ulq*_*rra 2 parameters spring spring-batch

我有一个带有FlatFileItemWriter的自定义编写器,我想传递一个在主类中定义的作业参数(输出文件)我该如何处理?非常感谢你

CustomWriter

 public class PersonItemWriter implements ItemWriter<Person> {

   private FlatFileItemWriter<String> flatFileItemWriter = new FlatFileItemWriter<String>();
   private Resource resource;

    @Override
    public void write(List<? extends Person> personList) throws Exception {

            flatFileItemWriter.setResource(new FileSystemResource(resource.getFile()));
            PassThroughLineAggregator<String> aggregator = new PassThroughLineAggregator<String();
            flatFileItemWriter.setLineAggregator(aggregator); 
            flatFileItemWriter.open(new ExecutionContext());             
            flatFileItemWriter.write(Arrays.asList(aggregator.aggregate("test")));
            flatFileItemWriter.close();
}


   public void setResource(Resource resource) {
       this.resource = resource;
   }

    }
Run Code Online (Sandbox Code Playgroud)

发射台

            JobLauncher jobLauncher = (JobLauncher) applicationContext.getBean("jobLauncher");
            Job job = (Job) applicationContext.getBean("personJob");
            /* Parameters sent to job */
            JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();

            jobParametersBuilder.addString("outputFileName", "file:" + personFile); // pass this to the itemWriter
Run Code Online (Sandbox Code Playgroud)

配置作业xml

    <bean id="personWriter" class="com.dev.writer.PersonItemWriter"  scope="step>
    <property name="resource" value="#{jobParameters[outputFileName]}" />
</bean> 
Run Code Online (Sandbox Code Playgroud)

Ser*_*mar 9

您必须使用步骤作用域作业作用域声明bean,以便根据作业参数对属性进行后期绑定:

<bean id="personWriter" class="com.dev.writer.PersonItemWriter" scope="step">
    <property name="resource" value="#{jobParameters[outputFileName]}" />
</bean>
Run Code Online (Sandbox Code Playgroud)

默认情况下,这些范围不可用,您需要通过使用batch命名空间或定义以下bean 来包含它们:

<bean class="org.springframework.batch.core.scope.StepScope" />
Run Code Online (Sandbox Code Playgroud)

更新:

这是完整的作者:

public class PersonItemWriter implements ItemWriter<Person> {

    FlatFileItemWriter<String> flatFileItemWriter = new FlatFileItemWriter<String>();
    private Resource resource;

    @Override
    public void write(List<? extends Person> personList) throws Exception {

            flatFileItemWriter.setResource(resource);// how the pass the job parameter file here
            PassThroughLineAggregator<String> aggregator = new PassThroughLineAggregator<String();
            flatFileItemWriter.setLineAggregator(aggregator);
            aggregator.aggregate("test"); // do not save in output file
    }

    public FlatFileItemWriter<String> getFlatFileItemWriter() {
        return flatFileItemWriter;
    }

    public void setFlatFileItemWriter(FlatFileItemWriter<String> flatFileItemWriter) {
        this.flatFileItemWriter = flatFileItemWriter;
    }

    public void setResource(Resource resource) {
        this.resource = resource;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 更新自定义写入器并使用相应的setter添加资源属性 (2认同)