atlassian scheduler api runs the job more than once in Jira data center

Necla Mutlu June 4, 2021

I used atlassian scheduler api to run some code inside a plugin at 00.00 A.M everyday in a data center version of Jira. Although I added RUN_ONCE_PER_CLUSTER run mode to the scheduler service, it runs in all nodes. Is there a way to fix this?

class ScheduledJobRunner implements JobRunner {
@Autowired
private final SchedulerService schedulerService;

private JobRunnerKey JOB_RUNNER_KEY = JobRunnerKey.of(ExecutiveSummaryChangeScannerTask.class.toString() + "ResourceUtilization");
private static final JobId JOB_ID = JobId.of("resourceUtilization" + System.currentTimeMillis());
private ExecutiveSummaryChangeScannerTask table1Task = ExecutiveSummaryChangeScannerTask.getInstance();
private UtilizationPerProjectChangeScannerTask table2Task = UtilizationPerProjectChangeScannerTask.getInstance();
private DomainUtilizationChangeScannerTask table3Task = DomainUtilizationChangeScannerTask.getInstance();
private UtilizationPerPortfolioChangeScannerTask table4Task = UtilizationPerPortfolioChangeScannerTask.getInstance();

private final Logger logger = Logger.getLogger(ChangeScannerImpl.class);

@Autowired
public ScheduledJobRunner(SchedulerService schedulerService) {
this.schedulerService = schedulerService;
}

@PostConstruct
public void registerJob() throws SchedulerServiceException {
// register the implementation to be called by the scheduler
schedulerService.registerJobRunner(JOB_RUNNER_KEY, this);

if (schedulerService.getJobDetails(JOB_ID) == null) {
// schedule the job for running once in the first day of each month if it is not already scheduled
schedulerService.scheduleJob(JOB_ID, JobConfig.forJobRunnerKey(JOB_RUNNER_KEY)
.withSchedule(Schedule.forCronExpression("0 0 0 * * ? *"))
.withRunMode(RunMode.RUN_ONCE_PER_CLUSTER)
);
}
}

@PreDestroy
public void unregisterJob() {
// plugin is being disabled - no longer should execute this job (but other nodes might)
schedulerService.unregisterJobRunner(JOB_RUNNER_KEY);
}

public JobRunnerResponse runJob(JobRunnerRequest request) {
logger.error("Runjob is being executed.");
//DataHolder holder = DataHolder.getInstance();
//holder.setTeamsAndUsers(ApiHandler.getCRDTeams());

table1Task.execute();
table2Task.execute();
table3Task.execute();
table4Task.execute();
logger.error("Resource utilization data structures were prepared successfully");
logger.error("Runjob is being completed");
return JobRunnerResponse.success("Great success!");
}


}

 

0 answers

Suggest an answer

Log in or Sign up to answer