This commit is contained in:
Yuri Kuznetsov
2025-06-10 23:05:13 +03:00
parent 80be866475
commit 6ca6c0b938
7 changed files with 77 additions and 27 deletions
+2 -2
View File
@@ -257,8 +257,8 @@ class Binding implements BindingProcessor
);
$binder->bindImplementation(
'Espo\\Core\\Job\\JobSchedulerCreator',
'Espo\\Core\\Job\\JobScheduler\\Creators\\EntityJobSchedulerCreator',
'Espo\\Core\\Job\\JobScheduler\\Creator',
'Espo\\Core\\Job\\JobScheduler\\Creators\\EntityCreator',
);
}
+3 -2
View File
@@ -31,6 +31,7 @@ namespace Espo\Core\Job;
use Espo\Core\Field\DateTime as DateTimeField;
use Espo\Core\Job\Job\Data;
use Espo\Core\Job\JobScheduler\Creator;
use ReflectionClass;
use DateTimeInterface;
@@ -53,7 +54,7 @@ class JobScheduler
private ?DateInterval $delay = null;
public function __construct(
private JobSchedulerCreator $creator,
private Creator $creator,
) {}
/**
@@ -179,7 +180,7 @@ class JobScheduler
$data = $this->data ?? Data::create();
$creatorData = new JobScheduler\Data(
$creatorData = new Creator\Data(
className: $this->className,
queue: $this->queue,
group: $this->group,
@@ -27,12 +27,14 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Job;
namespace Espo\Core\Job\JobScheduler;
use Espo\Core\Job\JobScheduler\Creator\Data;
/**
* @since 9.2.0
*/
interface JobSchedulerCreator
interface Creator
{
public function create(JobScheduler\Data $data): void;
public function create(Data $data): void;
}
@@ -27,7 +27,7 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace Espo\Core\Job\JobScheduler;
namespace Espo\Core\Job\JobScheduler\Creator;
use Espo\Core\Field\DateTime;
use Espo\Core\Job\Job;
@@ -30,30 +30,32 @@
namespace Espo\Core\Job\JobScheduler\Creators;
use Espo\Core\Field\DateTime;
use Espo\Core\Job\JobScheduler;
use Espo\Core\Job\JobSchedulerCreator;
use Espo\Core\Job\JobScheduler\Creator;
use Espo\Entities\Job;
use Espo\ORM\EntityManager;
class EntityJobSchedulerCreator implements JobSchedulerCreator
class EntityCreator implements Creator
{
public function __construct(
private EntityManager $entityManager,
) {}
public function create(JobScheduler\Data $data): void
public function create(Creator\Data $data): void
{
$time = $data->time ?? DateTime::createNow();
$this->entityManager->createEntity(Job::ENTITY_TYPE, [
'name' => $data->className,
'className' => $data->className,
'queue' => $data->queue,
'group' => $data->group,
'targetType' => $data->data->getTargetType(),
'targetId' => $data->data->getTargetId(),
'data' => $data->data->getRaw(),
'executeTime' => $time->toString(),
]);
$job = $this->entityManager->getRDBRepositoryByClass(Job::class)->getNew();
$job
->setName($data->className)
->setClassName($data->className)
->setQueue($data->queue)
->setGroup($data->group)
->setData($data->data)
->setTargetId($data->data->getTargetId())
->setTargetType($data->data->getTargetType())
->setExecuteTime($time);
$this->entityManager->saveEntity($job);
}
}
+45
View File
@@ -29,6 +29,7 @@
namespace Espo\Entities;
use Espo\Core\Field\DateTime;
use Espo\Core\Job\Job as JobJob;
use Espo\Core\Job\Job\Status;
use Espo\Core\Job\JobDataLess;
@@ -212,4 +213,48 @@ class Job extends Entity
{
return $this->set('executedAt', DateTimeUtil::getSystemNowString());
}
public function setName(?string $name): self
{
return $this->set('name', $name);
}
public function setClassName(?string $className): self
{
return $this->set('className', $className);
}
public function setQueue(?string $queue): self
{
return $this->set('queue', $queue);
}
public function setGroup(?string $group): self
{
return $this->set('group', $group);
}
public function setTargetId(?string $targetId): self
{
return $this->set('targetId', $targetId);
}
public function setTargetType(?string $targetType): self
{
return $this->set('targetType', $targetType);
}
public function setData(?JobJob\Data $data): self
{
if (!$data) {
return $this->set('data', $data);
}
return $this->set('data', $data->getRaw());
}
public function setExecuteTime(?DateTime $executeTime): self
{
return $this->setValueObject('executeTime', $executeTime);
}
}
@@ -31,7 +31,7 @@ namespace tests\unit\Espo\Core\Job;
use Espo\Core\Field\DateTime as DateTimeField;
use Espo\Core\Job\JobScheduler;
use Espo\Core\Job\JobSchedulerCreator;
use Espo\Core\Job\JobScheduler\Creator;
use Espo\Core\Job\QueueName;
use Espo\Core\Job\Job\Data;
use PHPUnit\Framework\TestCase;
@@ -42,11 +42,11 @@ use DateInterval;
class JobSchedulerTest extends TestCase
{
private ?JobSchedulerCreator $creator = null;
private ?JobScheduler\Creator $creator = null;
protected function setUp(): void
{
$this->creator = $this->createMock(JobSchedulerCreator::class);
$this->creator = $this->createMock(JobScheduler\Creator::class);
}
public function testSchedule1(): void
@@ -57,7 +57,7 @@ class JobSchedulerTest extends TestCase
$delay = DateInterval::createFromDateString('1 minute');
$expectedData = new JobScheduler\Data(
$expectedData = new Creator\Data(
className: TestJob::class,
queue: QueueName::Q0,
group: null,
@@ -87,7 +87,7 @@ class JobSchedulerTest extends TestCase
$time = new DateTimeImmutable();
$expectedData = new JobScheduler\Data(
$expectedData = new Creator\Data(
className: TestJob::class,
queue: null,
group: 'g-1',