/** * Adds a job to the JobRunner instance. * * @param JobDefinition $definition Job definition (e.g. interval). * @throws InvalidArgumentException If the given class does not subclass Job. * @return void */ public function addJob(JobDefinition $definition) { $class = $definition->getClassName(); $reflection = new ReflectionClass($class); if (!$reflection->isSubclassOf(Job::class)) { $this->logger->error("{$reflection->getShortName()} does not subclass " . Job::class); throw new InvalidArgumentException("{$reflection->getShortName()} must subclass " . Job::class); } if (isset($this->jobs[$class])) { $this->logger->warning("{$reflection->getShortName()} is already registered, skipping"); return; } // If we have a run_time and interval set, we will ignore the interval when checking if job can run. if (!is_null($definition->getInterval()) && !is_null($definition->getRunTime())) { $definition->setInterval(null); $this->logger->warning("Both run_time and interval are set for {$reflection->getShortName()} — " . "prioritizing run_time"); } // Set internal definitions $definition->setLastRunTimeStart(null); $definition->setLastRunTimeFinish(null); $definition->setReflection($reflection); // Add to job list, using defaults where necessary $this->jobs[$class] = $definition; $this->createJobBuckets($class); $this->logger->info("Registered job {$reflection->getShortName()} -- " . ($definition->getEnabled() ? "enabled" : "disabled")); }