Apache ISIS вызывает действие программно

#java #isis

#java #isis

Вопрос:

Я пытаюсь настроить задание периодического отчета. Отчет должен быть создан без взаимодействия с пользователем, и задание должно быть запланировано при запуске приложения.

У меня работает фоновая служба и планировщик. Если я предоставляю действие createReport в виде кнопки в пользовательском интерфейсе, отчет создается при следующем запуске задания. Однако мне нужно, чтобы этот отчет создавался повторно и без взаимодействия с пользователем.

Я думаю, вопрос в том, как программно вызвать действие? Перемещение createReport() в службу домена и вызов его в аннотированном методе @PostConstruct приводит к исключению (попытка сохранить команду в IsisCommand). Я предполагаю, что у меня должен быть какой-то контекст для вызова действия? Или я неправильно подхожу к этому? Спасибо!

 @Action(command = CommandReification.ENABLED,
        commandExecuteIn=CommandExecuteIn.BACKGROUND)
public Command createReport() {
    backgroundService.execute(this).generateReport();
    return commandContext.getCommand();
}

@Programmatic
public void generateReport() {
    ....
}
  

Ответ №1:

Если вы просто хотите повторно вызвать метод, есть пара вариантов.

BackgroundService создает и сохраняет память о вызове действия, которая будет возвращена позже (с isis-command-module isis от isisaddons предоставляет готовую реализацию этого… вероятно, у вас это уже настроено).

Когда команда сохраняется, она должна завершать действие, т. Е. не может быть помечена с помощью @Programmatic. Итак, это одно.

Следующее заключается в том, что, поскольку это действие должно повторяться непрерывно, что-то должно создать следующий фоновый вызов.

Теоретически вы могли бы использовать backgroundService.execute(this).createReport(…) в качестве последнего вызова метода в createReport(…); одно предостережение заключается в том, что были недавно исправлены некоторые ошибки (сделанные, но еще не выпущенные в 1.13.1), чтобы это работало надежно; смотрите нашу доску Канбана.

В целом более простым подходом может быть полное игнорирование фоновой командной службы и просто использование AbstractIsisSessionTemplate, а затем вызов из пользовательского задания Quartz, аналогичного RunBackgroundCommandsJob.

И последнее: в вашем примере кода вы прокомментировали действие с помощью commandExecuteIn=BACKGROUND . Это означает, что платформа автоматически преобразует / сохраняет действие в виде команды … представьте, что она неявно вызывает backgroundCommand.execute(this).xxx() для вас. Нет необходимости также выполнять этот вызов в самой реализации действия.

HTH Dan

Комментарии:

1. Спасибо! Просто информация, которая мне была нужна. Я выбрал второй подход, и он работает просто отлично.