2

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

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

1 回答 1

3

如果你只是想重复调用一个方法,有几个选项。

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

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

接下来是,因为这个动作要不断重复,所以必须创建下一个后台调用。

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

一个更简单的方法可能是完全忽略后台命令服务,只使用AbstractIsisSessionTemplate,然后从自定义 Quartz 作业调用,类似于RunBackgroundCommandsJob

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

HTH丹

于 2016-10-21T12:25:14.563 回答