Java Пакетное задание: как ждать решения пользователя? - PullRequest
0 голосов
/ 04 марта 2020

В моем пакетном задании Java (JSR-352, JBeret) я достиг точки, когда я (необязательно) хотел бы дождаться решения пользователя. Согласно моим исследованиям, спецификация JSR-352 не обеспечивает концепцию ожидания. Итак, вопрос в том, какие есть другие варианты?

Мои текущие соображения:

  1. Я бы предпочел не разбивать работу, так как это потребовало бы поддержания связи между частями для мониторинга.
  2. Внедрение JMS в проект только для этой цели кажется несколько излишним.
  3. Опрос базы данных через JPA или JDB C тоже не кажется хорошим решением.
  4. Указанная c информация еще не доступна при запуске задания, поэтому ее нельзя передать в качестве параметра задания.
import javax.batch.api.Decider;
import javax.batch.runtime.StepExecution;
import javax.inject.Named;

@Named
public class AwaitingDecider implements Decider {

    @Override
    public String decide(final StepExecution[] executions) {
        String decision = // how to wait here?
        return decision;
    }
}

1 Ответ

1 голос
/ 04 марта 2020

Вы можете использовать некоторую java конструкцию параллелизма, такую ​​как CountDownLatch , чтобы координировать различные части вашей программы. Важной частью для пакетного приложения является наличие общего объекта, который содержит блокировку (или аналогичную), и все части обращаются к одному и тому же экземпляру. См. Связанную ветку: Java batch: jobContext transientUserData не прошел через шаги , особенно комментарий, связанный с использованием @JobScoped области CDI, предоставленной JBeret.

Если вы работаете в EE например, WildFly, вы также можете рассмотреть возможность ожидания / блокировки в @Singleton ejb с параллелизмом, управляемым компонентом .

...