package org.ovirt.engine.core.bll.job;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.ovirt.engine.core.common.BackendService;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.dao.JobDao;
import org.ovirt.engine.core.utils.timer.OnTimerMethodAnnotation;
import org.ovirt.engine.core.utils.timer.SchedulerUtilQuartzImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Responsible for clearing completed jobs from the database by running a fixed scheduled job
* each {@code ConfigValues.JobCleanupRateInMinutes} minutes.
*/
@Singleton
public class JobRepositoryCleanupManager implements BackendService {
private static final Logger log = LoggerFactory.getLogger(JobRepositoryCleanupManager.class);
private int succeededJobTime;
private int failedJobTime;
@Inject
private SchedulerUtilQuartzImpl schedulerUtil;
@Inject
private JobDao jobDao;
private JobRepositoryCleanupManager() {
}
/**
* Initializes the Job Cleanup scheduler
*/
@PostConstruct
public void initialize() {
log.info("Start initializing {}", getClass().getSimpleName());
succeededJobTime = Config.<Integer> getValue(ConfigValues.SucceededJobCleanupTimeInMinutes);
failedJobTime = Config.<Integer> getValue(ConfigValues.FailedJobCleanupTimeInMinutes);
Integer cleanupFrequency = Config.<Integer> getValue(ConfigValues.JobCleanupRateInMinutes);
schedulerUtil.scheduleAFixedDelayJob(this,
"completed_jobs_cleanup",
new Class[] {},
new Object[] {},
cleanupFrequency,
cleanupFrequency,
TimeUnit.MINUTES);
log.info("Finished initializing {}", getClass().getSimpleName());
}
/**
* Removes completed jobs:
* <ul>
* <li>The successful jobs will be deleted after {@code ConfigValues#SucceededJobCleanupTimeInMinutes}.</li>
* <li>The failed jobs will be deleted after {@code ConfigValues#FailedJobCleanupTimeInMinutes}.</li>
* </ul>
*/
@OnTimerMethodAnnotation("completed_jobs_cleanup")
public void cleanCompletedJob() {
Date succeededJobsDeleteTime =
new Date(System.currentTimeMillis() - TimeUnit.MILLISECONDS.convert(succeededJobTime, TimeUnit.MINUTES));
Date failedJobsDeleteTime =
new Date(System.currentTimeMillis() - TimeUnit.MILLISECONDS.convert(failedJobTime, TimeUnit.MINUTES));
try {
jobDao.deleteCompletedJobs(succeededJobsDeleteTime, failedJobsDeleteTime);
} catch (RuntimeException e) {
log.error("Failed to delete completed jobs: {}", e.getMessage());
log.debug("Exception", e);
}
}
}