View Javadoc
1   /*
2    * Copyright (C) 2024 B3Partners B.V.
3    *
4    * SPDX-License-Identifier: MIT
5    */
6   package org.tailormap.api.scheduling;
7   
8   import java.lang.invoke.MethodHandles;
9   import java.time.Instant;
10  import org.quartz.DisallowConcurrentExecution;
11  import org.quartz.JobDataMap;
12  import org.quartz.JobDetail;
13  import org.quartz.JobExecutionContext;
14  import org.quartz.PersistJobDataAfterExecution;
15  import org.slf4j.Logger;
16  import org.slf4j.LoggerFactory;
17  import org.springframework.lang.NonNull;
18  import org.springframework.scheduling.quartz.QuartzJobBean;
19  
20  /** POC task for testing purposes. */
21  @DisallowConcurrentExecution
22  @PersistJobDataAfterExecution
23  public class PocTask extends QuartzJobBean {
24    private static final Logger logger =
25        LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
26  
27    private String foo;
28  
29    @Override
30    protected void executeInternal(@NonNull JobExecutionContext context) {
31      final JobDetail jobDetail = context.getJobDetail();
32  
33      // NOTE: This immutable map is a snapshot of the job data maps at the time of the job execution.
34      final JobDataMap mergedJobDataMap = context.getMergedJobDataMap();
35  
36      // NOTE: This map is mutable and can be used to store job data.
37      final JobDataMap jobDataMap = jobDetail.getJobDataMap();
38  
39      // this.foo is set through QuartzJobBean
40      logger.debug("foo: {}", getFoo());
41  
42      logger.debug(
43          "executing POC task {}:{}, details: {}",
44          jobDetail.getKey().getGroup(),
45          jobDetail.getKey().getName(),
46          mergedJobDataMap.getWrappedMap());
47  
48      try {
49        for (int i = 0; i < 110; i += 10) {
50          // Simulate some work for a random period of time
51          long workingTime = (long) (Math.random() * 5000);
52          logger.debug("Working for {} ms", workingTime);
53          Thread.sleep(workingTime);
54          logger.debug("POC task is at {}%", i);
55          context.setResult(String.format("POC task is at %d%%", i));
56        }
57      } catch (InterruptedException e) {
58        logger.error("Thread interrupted", e);
59      }
60  
61      jobDataMap.put("executions", (1 + (int) mergedJobDataMap.getOrDefault("executions", 0)));
62      jobDataMap.put("lastExecutionFinished", Instant.now());
63      jobDataMap.put("lastResult", "POC task executed successfully");
64      context.setResult("POC task executed successfully");
65    }
66  
67    public String getFoo() {
68      return foo;
69    }
70  
71    public void setFoo(String foo) {
72      this.foo = foo;
73    }
74  }