索引队列

在应用程序中添加了搜索扩展组件后,会开始自动 跟踪实体的修改。本章节我们介绍如何设置使用新数据自动更新 ES 索引。

跟踪修改的机制会在 SEARCH_INDEXING_QUEUE 数据库表保存对修改后实体操作的队列。IndexingQueueManager bean 包含处理队列的方法,并将修改的数据发送至 ES。

应设置索引队列的定期处理机制,否则搜索将返回过时的数据。

可以按照下面的介绍使用 Quartz 任务调度定期处理队列。

默认 Quartz 配置

搜索扩展组件提供 Quartz 任务的默认配置,用于定期处理索引队列。按下列步骤使用:

  1. 按照 Quartz 章节的说明在项目中安装 安装 扩展组件。

  2. 视情况修改 CRON 表达式。默认值为 0/5 * * * * ?(5 秒一次)。

    jmix.search.indexing-queue-processing-cron = 0/10 * * * * ?

默认配置创建并设置 id 为 IndexingQueueProcessing 的调度计划。

自定义 Quartz 配置

如需使用自定义 Quartz 配置,请按照下列步骤:

  1. 按照 Quartz 章节的说明在项目中安装 安装 扩展组件。

  2. application.properties 文件添加下列应用程序属性禁用默认配置:

    jmix.search.use-default-indexing-queue-processing-quartz-configuration = false
  3. 创建自定义任务类,调用 IndexingQueueManager.processNextBatch()

    public class MyCustomQueueProcessingJob implements Job {
    
        @Autowired
        private IndexingQueueManager indexingQueueManager;
    
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            indexingQueueManager.processNextBatch();
        }
    }
  4. 启动程序后,打开 Administration(管理) → Quartz jobs(Quartz 任务) 界面,为 MyCustomQueueProcessingJob 类配置调度任务。

  5. 或者,如需在开发阶段配置调度任务,可以在主程序类中注册下列 bean:

    @Bean
    JobDetail myCustomIndexingQueueProcessingJob() {
    	return JobBuilder.newJob()
    			.ofType(IndexingQueueProcessingJob.class)
    			.storeDurably()
    			.withIdentity("MyCustomIndexingQueueProcessing")
    			.build();
    }
    
    @Bean
    Trigger myCustomIndexingQueueProcessingTrigger() {
    	return TriggerBuilder.newTrigger()
    			.forJob(myCustomIndexingQueueProcessingJob())
    			.startNow()
    			.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
    			.build();
    }