JSR 352:使用步骤上下文/作业上下文传递多个变量?

时间:2016-06-20 11:05:13

标签: java jsr352 java-batch

我需要在Step Listener和Writer之间传递更多的一个变量。使用StepCtx.setTransientUserData()我只能传递1个变量。

所以要传递多个变量,我应该创建一个map / class并传递它还是有更好的方法?

2 个答案:

答案 0 :(得分:2)

setTransientUserData(Object)应该足够,Object可以根据需要构造。您可以创建一个更复杂的对象来保存许多其他对象。

答案 1 :(得分:1)

正如您所说,无论JobContext还是StepContext,他们的方法setTransientUserData(Object)只能传递1个变量,这是不切实际的。也许它们并非专为复杂用途而设计,我不确定。

但是,您可以定义自己的上下文来存储变量。如果要为每个类共享此实例,请将其设为单例:

import javax.inject.Named;
import javax.inject.Singleton;

@Named
@Singleton
public class MyContext {

    private int rowCount;
    private Map<String, String> params;
    // or other things ...

}

然后,您可以通过CDI在MyContextItemWriter中使用自定义的上下文班级StepListener

public class MyItemWriter implements ItemWriter {

    @Inject
    private MyContext myContext;

    // then use it in your preferred method
}

但是,正如您在上一个问题中提到的步骤分区一样,您的工作可能是在多线程中运行。您应该了解并发问题:您需要为MyContext中的属性使用正确的数据结构。