Java EE 中的托管可调用任务中的参数被覆盖

Arguments overridden in managed callable tasks in Java EE

我有几个用 invokeAll 调用的容器管理的可调用任务。我需要将参数传递给这些任务中的每一个,并且由于我正在获取实例而不是手动创建对象(这是一项要求),所以我无法在构造函数中传递参数。

我在任务中使用 setter 来设置值,但由于某些原因,当我有多个任务时,最后一个值会覆盖前一个值。

鉴于此任务:

@Stateless
@LocalBean
public class MyTask implements Callable<String> {

    private String value;

    @Override
    public String call() throws Exception {
        System.out.println("MyTask called with value = " + value);
        return "MyTask called";
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

调用此 Test class:

public class Test {

    @Inject
    Instance<MyTask> myTaskInstance;

    @Resource
    private ManagedExecutorService executor;

    public void test() throws InterruptedException, ExecutionException {

        List<Callable<String>> tasks = new ArrayList<>(); 

        MyTask task1 = myTaskInstance.get();
        task1.setValue("VAL1");
        tasks.add(task1);

        MyTask task2 = myTaskInstance.get();
        task2.setValue("VAL2");
        tasks.add(task2);

        List<Future<String>> taskResults = null;
        taskResults = executor.invokeAll(tasks);

        List<String> results = new ArrayList<>(); 

        for(Future<String> taskResult : taskResults) {
                results.add(taskResult.get());
        }

    }

}

结果是(注意VAL2两次):

13:04:49,044 INFO [stdout] (EE-ManagedExecutorService-default-Thread-3) MyTask called with value = VAL2

13:04:49,045 INFO [stdout] (EE-ManagedExecutorService-default-Thread-4) MyTask called with value = VAL2

这段代码有什么问题?如何解决这个问题?

更新 将 bean 更改为 @Stateful 之后,这些是 invokeAll

之前的任务实例

这是完全正常的。

一个 @Stateless bean 在多个实例中创建,具体取决于您的服务器池配置。
因此从池中重新使用同一个实例。

根据定义,@Stateless bean 不能 维持状态。
请改用 @Stateful bean。