2017-03-09 31 views
0

我使用的是spring批次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> 

再次同样的工作属性值为true。

<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> 

任何帮助,高度赞赏。

+0

检查石英调度 – FaigB

回答

2

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

当启动一个工作,你可以做这样的事情......

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

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

然后,您可以在您的步注入jobParameter ...

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

我想你应该看看决胜局:

从春季批次文档:

在某些情况下,更多的信息比退出状态可能 决定哪些下一步行动执行要求。在这种情况下,可以使用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测试,并在春季批次的XML配置使用这个类。瞧!