在Spring批处理框架中将参数从一个作业传递到另一个作业

时间:2011-08-01 18:14:55

标签: spring spring-batch

如何将从一个作业中的数据库中提取的值作为参数传递给Spring框架中的另一个作业?PLese提供了示例代码。

2 个答案:

答案 0 :(得分:1)

我猜工作你的意思是预定任务。我处于相同的情况,其中2个工作依赖于彼此,例如:

<task:scheduled-tasks>
     <task:scheduled ref="deleteExpiredAccountsJob" method="launch" fixed-delay="100000" />
</task:scheduled-tasks>
<task:scheduled-tasks>
     <task:scheduled ref="emailDeletedAccountsConfirmationJob" method="launch" fixed-delay="100000" />
</task:scheduled-tasks>

我所做的是将ACCOUNTS表上的DELETE标志设置为true,并使emailDeletedAccountsConfirmationJob只读取带有DELETE = true的ACCOUNTS


另一个解决方案,如果你想在ItemReaders之间共享数据,那就是拥有一个Java Spring配置类“@Configuration”,并使用@Bean注释在这个类中声明你的ItemReaders,并且还有一个私有的同步Map或List。将在所有线程/作业或您的弹簧批处理步骤之间共享,并且您可以访问读者中的同步列表。

@Configuration
public class MySpringConfig {

    private List<String> list = Collections.synchronizedList(new ArrayList<String>());  

    @Bean
    @Scope("step")
    public JdbcCursorItemReader readerOne(){
        //add data to list
    }

    @Bean
    @Scope("step")
    public JdbcCursorItemReader readerTwo(){
        //check for certain data in the list, if exists ... do something
    }

答案 1 :(得分:0)

Spring批处理中的

作业被认为是不同的用例,没有框架强加的概念关系。您可以将作业视为独立的处理应用程序。

典型的批处理系统由数据源和数据接收器组成,例如消息队列,数据库或文件系统,因此一个作业正在生成数据,这些数据旨在由应用程序的另一部分处理。

您可能会重新设计您的设计以使用任务而不是工作。如果您有几个相互依赖的流程步骤,这将非常有用。 从StepExecution访问JobExcecution的方法。

我建议阅读优秀的文章以及“Spring Batch in Action”。