Java Batch job: как дождаться решения пользователя?

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

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

  1. Я бы предпочел не разделять работу, так как это потребует поддержания связи между частями для нужд мониторинга.
  2. Внедрение JMS в проект только для этой цели кажется несколько излишним.
  3. Опрос базы данных через JPA или JDBC также не кажется хорошим решением.
  4. Конкретная информация еще не доступна при запуске задания, поэтому ее нельзя передать в качестве параметра задания.
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;
    }
}

person Jens Piegsa    schedule 04.03.2020    source источник


Ответы (2)


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

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

person cheng    schedule 04.03.2020
comment
Большое спасибо за Ваш ответ. Как насчет @Singleton, возвращающего (Completable)Future<String>. Есть мысли по этому поводу? - person Jens Piegsa; 04.03.2020

В этом случае вам нужно остановить свою работу, чтобы дождаться внешнего события. Вот это пользователи, это могут быть и другие корпоративные информационные системы, даже запущенные от других компаний. Как скоро можно ожидать ответа? Это секунды? Минуты? Часы? Дней?

Имейте в виду, что в течение любого времени пакетное задание будет ждать. Использование синглетонов, блокировок или опросов будет использовать ресурсы вашей пакетной машины. Но, что еще важнее, что произойдет с вашей работой после того, как JVM будет убита и перезапущена?

Я думаю, что это те сценарии, когда вы выходите за пределы JSR-352 и хотите переключиться на механизм рабочего процесса, возможно, на тот, который выполняет BPM.

https://stackoverflow.com/search?q=java+workflow+engine

person Hiran Chaudhuri    schedule 23.10.2020