Аргументы, переопределенные в управляемых вызываемых задачах в Java EE - PullRequest
0 голосов
/ 07 марта 2019

У меня есть несколько управляемых контейнером задач, которые вызываются с 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

enter image description here

1 Ответ

3 голосов
/ 07 марта 2019

Это совершенно нормально.

Компонент @Stateless создается в нескольких экземплярах в зависимости от конфигурации пула серверов.
Таким образом, один и тот же экземпляр повторно используется из пула.

По определению @Stateless бин не может поддерживать состояние.
Вместо этого используйте бин @Stateful.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...