在春季批次启动期间设置属性值

时间:2017-03-09 21:26:59

标签: java spring-batch batch-processing

我正在使用spring batch 3.0。我有一个场景,我需要运行大约1000个具有1个属性值的作业和具有不同属性值的相同作业。有没有办法在启动或调度时间而不是在作业配置期间设置作业的属性。或者任何其他方式来实现这样的功能,而无需复制1000个工作。

<batch:job id="job_A" parent="simpleJob">
        <batch:step id="A" parent="simpleStep">
            <batch:tasklet>
                <bean id="bA" class="ClassA" scope="step">
                        <property name="downloadFileA" value="false" />
                </bean>     
            </batch:tasklet>
         </batch:step>  
</batch:job>

同样的工作,财产价值也是如此。

<batch:job id="job_A" parent="simpleJob">
        <batch:step id="A" parent="simpleStep">
            <batch:tasklet>
                <bean id="bA" class="ClassA" scope="step">
                        <property name="downloadFileA" value="true" />
                </bean>     
            </batch:tasklet>
         </batch:step>  
</batch:job>

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您可以使用传递给作业启动器的作业参数,然后可以从作业中的步骤进行访问。

启动工作时,您可以执行以下操作......

JobParameters jobParameters = new JobParametersBuilder()
    .addString("downloadFileA", "true")
    .toJobParameters();

JobExecution jobExecution = jobLauncher.run(job, jobParameters);

然后您可以在步骤中注入jobParameter ...

@Autowired
@Value("#{jobParameters[downloadFileA]}")
String downloadFileA;

答案 1 :(得分:0)

我认为你应该看看决策者:

从春季批处理文档:

  

在某些情况下,可能会有比ExitStatus更多的信息   需要决定下一步执行哪个步骤。在这种情况下,一个   JobExecutionDecider可用于协助决策。

public class MyDecider implements JobExecutionDecider {
    public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
        if (someCondition) {
            return "FAILED";
        }
        else {
            return "COMPLETED";
        }
    }
}
     

在作业配置中,“决定”标签将指定决策者   使用以及所有过渡。

<job id="job">
    <step id="step1" parent="s1" next="decision" />

    <decision id="decision" decider="decider">
        <next on="FAILED" to="step2" />
        <next on="COMPLETED" to="step3" />
    </decision>

    <step id="step2" parent="s2" next="step3"/>
    <step id="step3" parent="s3" />
</job>

<beans:bean id="decider" class="com.MyDecider"/>

所以换句话说,你应该创建一个实现JobExecutionDecider接口的类,然后根据你的if-else测试返回一个结果,并在spring batch xml配置中使用这个类。瞧!