我需要在 Step Listener 和 Writer 之间传递多个变量。使用 StepCtx.setTransientUserData() 我只能传递 1 个变量。
所以要传递多个变量,我应该创建一个地图/类并传递它还是有更好的方法?
我需要在 Step Listener 和 Writer 之间传递多个变量。使用 StepCtx.setTransientUserData() 我只能传递 1 个变量。
所以要传递多个变量,我应该创建一个地图/类并传递它还是有更好的方法?
setTransientUserData(Object) 应该足够了,Object 是根据需要构建的。您可以创建一个更复杂的对象来容纳许多其他对象。
如您所说,无论是 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 ...
}
然后,您可以通过 CDIMyContext
在您的ItemWriter
中使用您自定义的上下文类:StepListener
public class MyItemWriter implements ItemWriter {
@Inject
private MyContext myContext;
// then use it in your preferred method
}
但是,正如您在上一个问题中提到的步骤分区,您的工作可能在多线程中运行。您应该注意并发问题:您需要为MyContext
.