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

问题描述 投票:0回答:1

我有几个容器管理的可调用任务,使用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类调用:

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)使用value = VAL2调用MyTask

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

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

更新在将bean更改为@Stateful之后,这些是invokeAll之前的任务实例

enter image description here

enter image description here

java java-ee ejb
1个回答
3
投票

这是完全正常的。

根据您的服务器池配置,在多个实例中创建@Stateless bean。 因此,从池中重新使用相同的实例。

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

© www.soinside.com 2019 - 2024. All rights reserved.