1

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

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

4

2 回答 2

2

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

于 2017-05-17T18:39:36.687 回答
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 ...

}

然后,您可以通过 CDIMyContext在您的ItemWriter中使用您自定义的上下文类:StepListener

public class MyItemWriter implements ItemWriter {

    @Inject
    private MyContext myContext;

    // then use it in your preferred method
}

但是,正如您在上一个问题中提到的步骤分区,您的工作可能在多线程中运行。您应该注意并发问题:您需要为MyContext.

于 2016-06-20T14:58:10.960 回答