#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. Спасибо! Просто информация, которая мне была нужна. Я выбрал второй подход, и он работает просто отлично.