Apache ISIS以编程方式调用操作

时间:2016-10-21 10:16:01

标签: java isis

我正在尝试设置定期报告工作。应在没有用户交互的情况下创建报告,并在应用程序启动时安排作业。

我有后台服务和调度程序工作。如果我将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() {
    ....
}

1 个答案:

答案 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 丹