Indexing Queue
Once you integrate the Search add-on into your application, it immediately begins monitoring changes in your entities. This section details the process of configuring the automatic update of Elasticsearch indexes with the latest data.
The change tracking mechanism stores a queue of actions that should be done for changed entity instances in the SEARCH_INDEXING_QUEUE
database table. The IndexingQueueManager
bean contains methods to process the queue and send changed data to Elasticsearch.
It’s essential to establish regular processing of the indexing queue to ensure that search results reflect current data. |
For scheduling periodic queue processing, you can utilize the Quartz Job Scheduler following the instructions provided.
Default Quartz Configuration
The Search add-on comes with a pre-configured Quartz job for regularly processing the indexing queue. To enable this feature, follow these steps:
-
Include the Quartz add-on in your project as described in the Quartz / Installation section.
-
Modify the CRON expression as needed. The default value is
0/5 * * * * ?
(every 5 seconds).jmix.search.indexingQueueProcessingCron = 0/10 * * * * ?
The default configuration creates and schedules a job with the IndexingQueueProcessing
identity.
Custom Quartz Configuration
If you prefer to utilize a custom Quartz configuration, follow these steps:
-
Include the Quartz add-on in your project as described in the Quartz / Installation section.
-
Within the
application.properties
file, include the following property to deactivate the default configuration:jmix.search.useDefaultIndexingQueueProcessingQuartzConfiguration = false
-
Develop a custom job class that invokes
IndexingQueueManager.processNextBatch()
:public class MyCustomQueueProcessingJob implements Job { @Autowired private IndexingQueueManager indexingQueueManager; @Override public void execute(JobExecutionContext context) throws JobExecutionException { indexingQueueManager.processNextBatch(); } }
-
While the application is running, navigate to the Quartz → Quartz jobs view to set up a job for the
MyCustomQueueProcessingJob
class. -
Alternatively, if you want to configure the job during development, register the following beans in the application:
@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(); }