我有几个容器管理的可调用任务,使用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
之前的任务实例
这是完全正常的。
根据您的服务器池配置,在多个实例中创建@Stateless
bean。
因此,从池中重新使用相同的实例。
根据定义,@Stateless
bean无法维持状态。
请改用@Stateful
bean。