Запланированная задача с исполнением фоновых задач

Здравствуйте, мне необходимо при нажатии на кнопку создавать BackgroundTask’и, чтобы потом они поочередно исполнялись, также это все должно происходить раз в какое-то время. Должно получиться что-то наподобие запланированной задачи, в рамках которой выполняются фоновые задачи. Но при попытке выполнить этот код

val taskHandler = backgroundWorker.handle(work)
val uiAccessor = backgroundWorker.uiAccessor
taskHandler.execute()

в методе запланированной задачи выбрасывается исключение.

io.jmix.flowui.backgroundtask.IllegalConcurrentAccessException: UI Shared state was accessed from a background thread

Что можно сделать в моей ситуации?

Добрый день,

Данное исключение io.jmix.flowui.backgroundtask.IllegalConcurrentAccessException сообщает о том, что из метода BackgroundTask.run() произошло обращение к компонентам пользовательского интерфейса. Этого делать нельзя. Если вам нужны какие-нибудь данные из пользовательского интерфейса для выполнения задачи, то нужно переопределить метод BackgroundTask.getParams() и подготовить нужные параметры. Его вызов произойдет в потоке UI в момент начала работы фоновой задачи. Далее эти параметры доступны в методе BackgroundTask.run(TaskLifeCycle<T> taskLifeCycle) через вызов метода taskLifeCycle.getParams().

Более детальная информация по фоновым задачам доступна здесь.

А можно ли сделать так, чтобы в каком-нибудь условно BackgrounTaskManager’е на методе висела аннотация @Scheduled и фоновые задачи запускались раз в какой-то промежуток времени? Мне нужно, чтобы запускалось определенное количество фоновых задач сразу же после запуска приложения. Далее при заходе на нужный экран, можно было бы посмотреть процесс исполнения данных задач

Для ваших задач лучше всего подойдет add-on Quartz. Он предоставляет широкие возможности по настройке различных параметров запланированной задачи. Также в расширении доступен экран с просмотром текущих заданий и их статусом.

Если говорить про другие варианты, то вам доступна Spring аннотация @Scheduled. Создав бин с методом помеченным аннотацией @Scheduled(initialDelay = 0), метод вызовется сразу после старта приложения. Для просмотра задач вы можете создать сущность TaskDetails с атрибутами: name, completed и т.д. И при старте выполнения своей логики создавать сущность, а после выполнения обновлять ее статус. И в этом случае вы сможете видеть свои задачи в сгенерированном экране TasksListView.