报表执行历史
报表扩展组件提供报表执行历史管理的几个功能:
-
存储每个报表的执行历史。系统管理员可以使用报表执行历史查找每个报表的执行频率、每次的执行时间、执行人以及报表运行时发生了什么错误。
-
清除过期的报表执行历史。
报表执行历史默认不启用,可以设置 jmix.reports.historyRecordingEnabled 应用程序属性为 true
启用。
报表执行历史视图是管理性质的视图,所以没有添加到主菜单。要查看执行记录,切换到报表列表视图(Reports →Reports 菜单项),选择一些报表,然后点击 Execution history(执行历史) 按钮。
ExecutionHistoryAction
可以在任何视图通过 ShowExecutionReportHistoryAction
操作关联的按钮或右键菜单打开报表执行历史。
io.jmix.reportsflowui.action.ShowExecutionReportHistoryAction
- 是一个 标准操作,用于展示报表执行历史。需要关联一个 button
或列表组件(dataGrid
、treeDataGrid
等)。
下面是 dataGrid
使用声明式操作的示例:
<hbox id="buttonsPanel" classNames="buttons-panel">
<!-- ... -->
<button id="historyBtn" action="literatureTypesDataGrid.showHistory"/> (1)
</hbox>
<dataGrid id="literatureTypesDataGrid"
width="100%"
minHeight="20em"
dataContainer="literatureTypesDc">
<actions>
<!-- ... -->
<action id="showHistory" type="report_showExecutionReportHistory"/> (2)
</actions>
</dataGrid>
1 | 报表历史操作的按钮。 |
2 | type 属性定义了一个特殊的 report_showExecutionReportHistory 操作类型,操作由框架提供。 |
使用编程式方法创建操作,该操作关联一个在 XML 描述中声明的按钮,示例:
@ViewComponent
private JmixButton historyBtn;
@Autowired
private Actions actions;
@Subscribe
public void onInit(final InitEvent event) {
ShowExecutionReportHistoryAction<LiteratureType> action =
actions.create(ShowExecutionReportHistoryAction.ID);
historyBtn.setAction(action);
}
当操作执行时,会打开一个 Execution history(执行历史) 对话框展示与当前视图相关的报表。点击 Execution History(执行历史) 按钮之后,会展示选中报表的执行历史。
“Cancelled(取消)” 标志表示用户以后台任务的形式启动报表,然后又取消了。
报表执行历史也记录那些从报表详情视图直接运行(点击 Run(运行) 按钮)还没有保存到数据库的报表。
输出文档
该机制提供了将输出文档,即报表结果文件,保存到 文件存储 的功能。该功能会消耗一定的文件存储空间,需要单独配置,并且默认是关闭的。如需开启,可以设置 jmix.reports.saveOutputDocumentsToHistory 应用程序属性为 true
:
jmix.reports.saveOutputDocumentsToHistory = true
现在,如果在执行历史表选中一项,Download document(下载文档) 按钮可点击。点击即可下载报表结果文件。
使用 表格 类型的报表不会有结果文件,所以这些类型的报表执行结果不会保存任何的输出文档。
如果是使用编程的方式调用 createAndSaveReport()
方法运行报表,则会为同样的结果文件保存另一份拷贝。这两份文件是互相独立存储在文件存储中的。
清理执行历史
可以使用 Quartz 任务调度器周期性地清理报表执行历史。
-
按照 Quartz/安装 部分的介绍安装 Quartz 组件。
-
创建一个任务类并调用
ReportExecutionHistoryRecorder.cleanupHistory()
:@Component("ReportHistoryCleaner") public class ReportHistoryCleanJob implements Job { @Autowired private ReportExecutionHistoryRecorder reportExecutionHistoryRecorder; @Override public void execute(JobExecutionContext context) throws JobExecutionException { reportExecutionHistoryRecorder.cleanupHistory(); } }
-
程序启动后,打开 Quartz → Quartz jobs(Quartz 任务) 视图,并为
ReportHistoryCleanJob
类配置一个任务。 -
或者,如需在开发阶段配置任务,可以在主应用程序类中添加下列 bean:
@Bean JobDetail reportHistoryCleanJob() { return JobBuilder.newJob() .ofType(ReportHistoryCleanJob.class) .storeDurably() .withIdentity("reportHistoryClean") .build(); } @Bean Trigger reportHistoryCleanTrigger() { return TriggerBuilder.newTrigger() .forJob(reportHistoryCleanJob()) .startNow() .withSchedule(CronScheduleBuilder.cronSchedule("0 0 1 * * ?")) (1) .build(); }
1 每天凌晨,例如, 0 0 1 * * ?
-
设置报表历史清理的应用程序属性:
-
jmix.reports.historyCleanupMaxDays - 默认 730 天。
-
jmix.reports.historyCleanupMaxItemsPerReport - 默认 1000。
-
当报表执行历史记录被清理后,相关联的报表输出文档也从文件存储中删除了。