我需要在Step Listener和Writer之间传递更多的一个变量。使用StepCtx.setTransientUserData()我只能传递1个变量。
所以要传递多个变量,我应该创建一个map / class并传递它还是有更好的方法?
答案 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在MyContext
,ItemWriter
中使用自定义的上下文班级StepListener
:
public class MyItemWriter implements ItemWriter {
@Inject
private MyContext myContext;
// then use it in your preferred method
}
但是,正如您在上一个问题中提到的步骤分区一样,您的工作可能是在多线程中运行。您应该了解并发问题:您需要为MyContext
中的属性使用正确的数据结构。