Apache ISIS 以编程方式调用操作

Apache ISIS call action programmatically

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

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

如果您只想重复调用一个方法,有两种选择。

BackgroundService 创建并保存一个动作调用的纪念品,以便稍后获取(使用 isisaddons 的 isis-command-module 提供了一个开箱即用的实现......你可能有这个已配置)。

当一个命令被持久化时,它必须包装一个动作,即不能用@Programmatic 注释。所以这是一回事。

其次,既然要不断重复这个动作,那么必须要有东西来创建下一个后台调用。

理论上您可以使用 backgroundService.execute(this).createReport(...) 作为 createReport(...) 中的最后一个方法调用;需要注意的是,最近修复了一些错误(已完成但仍将在 1.13.1 中发布)以使其可靠地工作;看看我们的 Kanban board.

一个更简单的方法可能是完全忽略后台命令服务,只使用 AbstractIsisSessionTemplate, and then call from a custom Quartz job, similar to RunBackgroundCommandsJob

最后一件事:在您的代码示例中,您使用 commandExecuteIn=BACKGROUND 注释了操作。这意味着框架会自动 reifies/persists 作为命令的操作...想象一下它正在为您隐式调用 backgroundCommand.execute(this).xxx() 。也无需在操作实现本身内进行该调用。

HTH 旦