gpt4 book ai didi

java - Apache ISIS 以编程方式调用操作

转载 作者:行者123 更新时间:2023-11-30 07:58:45 25 4
gpt4 key购买 nike

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

我有后台服务和调度程序在工作。如果我将 createReport 操作公开为 UI 中的按钮,则在下次触发作业时会创建一个报告。但是,我需要在没有用户交互的情况下重复创建此报告。

我想问题是如何以编程方式调用一个 Action ?将 createReport() 移动到域服务并在 @PostConstruct 注释方法中调用它会产生异常(尝试将命令持久化到 IsisCommand)。我猜我必须为 Action 调用提供某种上下文?还是我以错误的方式接近这个?谢谢!

@Action(command = CommandReification.ENABLED,
commandExecuteIn=CommandExecuteIn.BACKGROUND)
public Command createReport() {
backgroundService.execute(this).generateReport();
return commandContext.getCommand();
}

@Programmatic
public void generateReport() {
....
}

最佳答案

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

BackgroundService 创建并保存一个 Action 调用的纪念品,稍后将被拾取(isisaddons 的 isis-command-module 提供了一个开箱即用的实现......你可能已经配置了这个).

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

接下来是,既然这个 Action 要不断重复,那么就必须要有什么东西来创建下一个后台调用。

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

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

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

HTH丹

关于java - Apache ISIS 以编程方式调用操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40173998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com