我正在尝试设置定期报告工作。应在没有用户交互的情况下创建报告,并在应用程序启动时安排作业。
我有后台服务和调度程序工作。如果我将createReport操作作为UI中的按钮公开,则在下次触发作业时会创建报告。但是,我需要重复创建此报告,而无需用户交互。
我想问题是如何以编程方式调用一个动作?将createReport()移动到域服务并在@PostConstruct注释方法中调用它会产生异常(尝试将命令持久保存到IsisCommand)。我猜我必须有一些动作调用的上下文?或者我是以错误的方式接近这个?谢谢!
@Action(command = CommandReification.ENABLED,
commandExecuteIn=CommandExecuteIn.BACKGROUND)
public Command createReport() {
backgroundService.execute(this).generateReport();
return commandContext.getCommand();
}
@Programmatic
public void generateReport() {
....
}
答案 0 :(得分:3)
如果您只想重复调用某个方法,可以选择几种方法。
BackgroundService创建并保留了稍后要拾取的动作调用的纪念品(isisaddons的isis-command-module提供了一个开箱即用的实现...你可能已经配置了这个)。
当命令被持久化时,它必须包装一个动作,即不能用@Programmatic注释。这是一回事。
接下来是,因为要连续重复此操作,所以必须创建下一个后台调用。
理论上你可以使用backgroundService.execute(this).createReport(...)作为createReport(...)中的最后一个方法调用;一个警告是,最近的一些错误修复(已经制定但仍将在1.13.1中发布)以使其可靠地工作;请参阅我们的Kanban board。
一个更简单的方法可能是完全忽略后台命令服务,只需使用AbstractIsisSessionTemplate,然后从自定义Quartz作业调用,类似于RunBackgroundCommandsJob。
最后一件事:在您的代码示例中,您使用commandExecuteIn = BACKGROUND注释了该操作。这意味着框架会自动将操作作为命令进行动态/持久化...想象一下,它隐式调用了backgroundCommand.execute(this).xxx()。没有必要在动作实现本身内进行调用。
HTH 丹