报表执行历史

报表扩展组件提供报表执行历史管理的几个功能:

  1. 存储每个报表的执行历史。系统管理员可以使用报表执行历史查找每个报表的执行频率、每次的执行时间、执行人以及报表运行时发生了什么错误。

  2. 清除过期的报表执行历史。

报表执行历史默认不启用,可以设置 jmix.reports.history-recording-enabled 应用程序属性为 true 启用。

报表执行历史界面是管理性质的界面,所以没有添加到主菜单。要查看执行记录,切换到报表浏览界面(Reports →Reports 菜单项),然后点击 Execution history(执行历史) 按钮。

如果在 Reports 表格选中了任何报表,则执行历史只会显示这些选中报表相关的记录。如果没选中报表,则显示所有报表的记录。

ExecutionHistoryAction

可以在任何界面通过 ExecutionHistoryAction 打开报表执行历史,该操作关联至一个按钮或者组件的右键菜单。

io.jmix.reportsui.action.list.ExecutionHistoryAction - 是一个 标准操作,用于展示报表执行历史。需要关联一个 Button 或列表组件(TableDataGrid 等)。

下面是 Table 使用声明式操作的示例:

<actions>
    <action id="history" type="executionHistory"/> (1)
</actions>
<buttonsPanel id="buttonsPanel"
              alwaysVisible="true">
    <button id="historyBtn" action="literatureTypesTable.history"/> (2)
</buttonsPanel>
1 type 属性定义了一个特殊的 executionHistory 操作类型,操作由框架提供。
2 添加按钮执行报表历史操作。

使用编程式方法创建操作,该操作关联一个在 XML 描述中声明的按钮,示例:

@Inject
protected Actions actions;

@Inject
protected Button execHistoryBtn;

@Subscribe
public void onInit(InitEvent event) {
    ExecutionHistoryAction action = actions.create(ExecutionHistoryAction.class, "execHistoryReport");
    execHistoryBtn.setAction(action);
}

当操作执行时,会打开一个 Execution history(执行历史) 对话框展示与当前界面相关的报表。点击 Execution History(执行历史) 按钮之后,会展示选中报表的执行历史。如果未选中任何报表,则会展示与此界面关联的所有报表的执行历史。

report execution history
Figure 1. 报表执行历史界面

“Cancelled(取消)” 标志表示用户以后台任务的形式启动报表,然后又取消了。

报表执行历史也记录那些从报表编辑器直接运行(点击 Run(运行) 按钮)还没有保存到数据库的报表。

输出文档

该机制提供了将输出文档,即报表结果文件,保存到 文件存储 的功能。该功能会消耗一定的文件存储空间,需要单独配置,并且默认是关闭的。如需开启,可以设置 jmix.reports.save-output-documents-to-history 应用程序属性为 true

jmix.reports.save-output-documents-to-history = true

现在,如果在执行历史表选中一项,Download document(下载文档) 按钮可点击。点击即可下载报表结果文件。

使用 图表透视表表格 类型的报表不会有结果文件,所以这些类型的报表执行结果不会保存任何的输出文档。

如果是使用编程的方式调用 createAndSaveReport() 方法运行报表,则会为同样的结果文件保存另一份拷贝。这两份文件是互相独立存储在文件存储中的。

清理执行历史

可以使用 Quartz 任务调度器周期性地清理报表执行历史。

  1. 按照 Quartz / 安装 部分的介绍安装 Quartz 组件。

  2. 创建一个任务类并调用 ReportExecutionHistoryRecorder.cleanupHistory()

    @Component("jmxrpr_ReportHistoryCleaner")
    public class ReportHistoryCleanJob implements Job {
    
        @Autowired
        private ReportExecutionHistoryRecorder reportExecutionHistoryRecorder;
    
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            reportExecutionHistoryRecorder.cleanupHistory();
        }
    }
  3. 程序启动后,打开 Administration(管理) → Quartz jobs(Quartz 任务) 界面,并为 ReportHistoryCleanJob 类配置一个任务。

  4. 或者,如需在开发阶段配置任务,可以在主应用程序类中添加下列 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 * * ?
  5. 设置报表历史清理的应用程序属性:

当报表执行历史记录被清理后,相关联的报表输出文档也从文件存储中删除了。