diff --git a/application/Espo/Core/Job/AbstractGroupJob.php b/application/Espo/Core/Job/AbstractGroupJob.php new file mode 100644 index 0000000000..b42edb9122 --- /dev/null +++ b/application/Espo/Core/Job/AbstractGroupJob.php @@ -0,0 +1,135 @@ +jobManager = $jobManager; + $this->entityManager = $entityManager; + $this->config = $config; + } + + public function run(JobData $data): void + { + $limit = $this->config->get('jobGroupMaxPortion') ?? self::PORTION_NUMBER; + + $group = $data->get('group'); + + $this->jobManager->processGroup($group, $limit); + } + + public function prepare(ScheduledJobData $data, DateTimeImmutable $executeTime): void + { + $groupList = []; + + $query = $this->entityManager + ->getQueryBuilder() + ->select('group') + ->from(JobEntity::ENTITY_TYPE) + ->where([ + 'status' => JobStatus::PENDING, + 'queue' => null, + 'group!=' => null, + 'executeTime<=' => $executeTime->format(DateTime::SYSTEM_DATE_TIME_FORMAT), + ]) + ->groupBy('group') + ->build(); + + $sth = $this->entityManager->getQueryExecutor()->execute($query); + + while ($row = $sth->fetch()) { + $group = $row['group']; + + if ($group === null) { + continue; + } + + $groupList[] = $group; + } + + if (!count($groupList)) { + return; + } + + foreach ($groupList as $group) { + $existingJob = $this->entityManager + ->getRDBRepository(JobEntity::ENTITY_TYPE) + ->select('id') + ->where([ + 'scheduledJobId' => $data->getId(), + 'targetGroup' => $group, + 'status' => [ + JobStatus::RUNNING, + JobStatus::READY, + JobStatus::PENDING, + ], + ]) + ->findOne(); + + if ($existingJob) { + continue; + } + + $name = $data->getName() . ' :: ' . $group; + + $this->entityManager->createEntity(JobEntity::ENTITY_TYPE, [ + 'scheduledJobId' => $data->getId(), + 'executeTime' => $executeTime->format(DateTime::SYSTEM_DATE_TIME_FORMAT), + 'name' => $name, + 'data' => [ + 'group' => $group, + ], + 'targetGroup' => $group, + ]); + } + } +} diff --git a/application/Espo/Jobs/ProcessJobGroup.php b/application/Espo/Jobs/ProcessJobGroup.php new file mode 100644 index 0000000000..99519c3aed --- /dev/null +++ b/application/Espo/Jobs/ProcessJobGroup.php @@ -0,0 +1,34 @@ + 'group-1', ]); - // @todo Change to `$this->jobManager->process();`. - $this->jobManager->processGroup('group-0', 100); - $this->jobManager->processGroup('group-1', 100); + $this->jobManager->process(); $job1Reloaded = $this->entityManager->getEntity('Job', $job1->getId()); $job2Reloaded = $this->entityManager->getEntity('Job', $job2->getId());