19 declare(strict_types=1);
47 return ((
int) $this->clock_factory->system()->now()->format(
'Uu')) / 1000000;
52 $this->
logger->info(
'CRON - batch start');
54 $ts = $this->clock_factory->system()->now()->getTimestamp();
55 $this->
settings->set(
'last_cronjob_start_ts', (
string) $ts);
59 $this->
logger->info(sprintf(
60 'Set last datetime to: %s',
63 $this->
logger->info(sprintf(
64 'Verification of last run datetime (read from database): %s',
72 if (!defined(
'ILIAS_HTTP_PATH')) {
77 foreach ($this->cronRepository->getCronJobData(null,
false) as $row) {
78 $job = $this->cronRepository->getJobInstanceById($row[
'job_id']);
81 $this->
runJob($job, $actor);
86 foreach ($this->cronRepository->getPluginJobs(
true) as $item) {
88 $this->
runJob($item[0], $actor);
91 $this->
logger->info(
'CRON - batch end');
98 $this->
logger->info(
'CRON - manual start (' . $jobId .
')');
100 $job = $this->cronRepository->getJobInstanceById($jobId);
102 if ($job->isManuallyExecutable()) {
103 $result = $this->
runJob($job, $actor, null,
true);
105 $this->
logger->info(
'CRON - job ' . $jobId .
' is not intended to be executed manually');
108 $this->
logger->info(
'CRON - job ' . $jobId .
' seems invalid or is inactive');
111 $this->
logger->info(
'CRON - manual end (' . $jobId .
')');
129 if (null === $jobData) {
131 $jobsData = $this->cronRepository->getCronJobData($job->
getId());
132 $jobData = array_pop($jobsData);
136 return $this->clock_factory->system()->now();
140 if ($jobData[
'alive_ts']) {
141 $this->
logger->info(
'CRON - job ' . $jobData[
'job_id'] .
' still running');
146 if ($this->clock_factory->system()->now()->getTimestamp() - ((
int) $jobData[
'alive_ts']) > $cut) {
147 $this->cronRepository->updateRunInformation($jobData[
'job_id'], 0, 0);
153 $result->setMessage(
'Cron job deactivated because it has been inactive for 3 hours');
155 $this->cronRepository->updateJobResult(
157 $this->clock_factory->system()->now(),
163 $this->
logger->info(
'CRON - job ' . $jobData[
'job_id'] .
' deactivated (assumed crash)');
168 '@' . $jobData[
'job_result_ts']
169 ))->setTimezone($this->clock_factory->system()->now()->getTimezone()) : null,
170 $jobData[
'schedule_type'] ? (
int) $jobData[
'schedule_type'] : null,
171 $jobData[
'schedule_value'] ? (
int) $jobData[
'schedule_value'] : null,
174 $this->
logger->info(
'CRON - job ' . $jobData[
'job_id'] .
' started');
176 $this->cronRepository->updateRunInformation(
178 $this->clock_factory->system()->now()->getTimestamp(),
179 $this->clock_factory->system()->now()->getTimestamp()
184 $result = $job->
run();
189 ilStr::subStr(sprintf(
'Exception: %s / %s', $e->getMessage(), $e->getTraceAsString()), 0, 400)
192 $this->
logger->error($e->getMessage());
193 $this->
logger->error($e->getTraceAsString());
200 $this->
logger->info(
'CRON - job ' . $jobData[
'job_id'] .
' invalid configuration');
206 $result->setDuration($ts_dur);
208 $this->cronRepository->updateJobResult(
210 $this->clock_factory->system()->now(),
215 $this->cronRepository->updateRunInformation($jobData[
'job_id'], 0, 0);
217 $this->
logger->info(
'CRON - job ' . $jobData[
'job_id'] .
' finished');
219 $this->
logger->info(
'CRON - job ' . $jobData[
'job_id'] .
' returned status inactive');
230 $result->setMessage(
'Cron job re-activated by admin');
232 $this->cronRepository->updateJobResult(
234 $this->clock_factory->system()->now(),
239 $this->cronRepository->resetJob($job);
246 $this->cronRepository->activateJob($job, $this->clock_factory->system()->now(), $actor, $wasManuallyExecuted);
252 $this->cronRepository->deactivateJob($job, $this->clock_factory->system()->now(), $actor, $wasManuallyExecuted);
258 $jobs_data = $this->cronRepository->getCronJobData($jobId);
260 return $jobs_data !== [] && $jobs_data[0][
'job_status'];
265 $jobs_data = $this->cronRepository->getCronJobData($jobId);
267 return $jobs_data !== [] && !((bool) $jobs_data[0][
'job_status']);
270 public function ping(
string $jobId): void
272 $this->db->manipulateF(
273 'UPDATE cron_job SET alive_ts = %s WHERE job_id = %s',
275 [$this->clock_factory->system()->now()->getTimestamp(), $jobId]
resetJob(ilCronJob $job, ilObjUser $actor)
const CODE_SUPPOSED_CRASH
activationWasToggled(ilDBInterface $db, ilSetting $setting, bool $a_currently_active)
Important: This method is (also) called from the setup process, where the constructor of an ilCronJob...
runActiveJobs(ilObjUser $actor)
setDateTimeProvider(?Closure $date_time_provider)
const STATUS_INVALID_CONFIGURATION
static formatDate(ilDateTime $date, bool $a_skip_day=false, bool $a_include_wd=false, bool $include_seconds=false)
static subStr(string $a_str, int $a_start, ?int $a_length=null)
isJobInactive(string $jobId)
activateJob(ilCronJob $job, ilObjUser $actor, bool $wasManuallyExecuted=false)
static useRelativeDates()
static _lookupValue(string $a_module, string $a_keyword)
__construct(ilCronJobRepository $cronRepository, ilDBInterface $db, ilSetting $settings, ilLogger $logger, ClockFactory $clock_factory)
ClockFactory $clock_factory
ilCronJobRepository $cronRepository
deactivateJob(ilCronJob $job, ilObjUser $actor, bool $wasManuallyExecuted=false)
isJobActive(string $jobId)
runJob(ilCronJob $job, ilObjUser $actor, ?array $jobData=null, bool $isManualExecution=false)
Run single cron job (internal)
runJobManual(string $jobId, ilObjUser $actor)
static setUseRelativeDates(bool $a_status)
set use relative dates
isDue(?DateTimeImmutable $last_run, ?int $schedule_type, ?int $schedule_value, bool $is_manually_executed=false)