У меня есть несколько управляемых контейнером задач, которые вызываются с invokeAll
. Мне нужно передать аргументы каждой из этих задач, и, поскольку я получаю экземпляры вместо того, чтобы создавать объекты вручную (это требование), я не могу передавать аргументы в конструкторе.
Я использую сеттеры в задаче для установки значений, но по некоторым причинам, когда у меня несколько задач, последнее значение переопределяет предыдущее.
С учетом этой задачи:
@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) MyTask вызывается со значением
= VAL2
13: 04: 49,045 INFO [стандартный вывод]
(EE-ManagedExecutorService-default-Thread-4) MyTask вызывается со значением
= VAL2
Что не так с этим кодом? Как это исправить?
UPDATE
После изменения компонента на @Stateful
это экземпляры задачи прямо перед invokeAll
![enter image description here](https://i.stack.imgur.com/lwqJc.png)
![enter image description here](https://i.stack.imgur.com/Nr2gA.png)