Browse Source

setup scheduler for cronjobs

Olivier Massot 3 months ago
parent
commit
653a655f3f
3 changed files with 58 additions and 3 deletions
  1. 36 0
      src/Message/Handler/CronJobHandler.php
  2. 16 0
      src/Message/Message/CronJob.php
  3. 6 3
      src/Schedule.php

+ 36 - 0
src/Message/Handler/CronJobHandler.php

@@ -0,0 +1,36 @@
+<?php
+
+namespace App\Message\Handler;
+
+use App\Message\Message\CronJob;
+use App\Service\ServiceIterator\CronjobIterator;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Messenger\Attribute\AsMessageHandler;
+
+#[AsMessageHandler]
+class CronJobHandler
+{
+    public function __construct(
+        private CronjobIterator $cronjobIterator,
+        private LoggerInterface $cronLogger,
+    ) {
+    }
+
+    public function __invoke(CronJob $message): void
+    {
+        try {
+            $job = $this->cronjobIterator->getByName($message->getJobName());
+
+            $this->cronLogger->info('Scheduler will execute `' . $job->name() . '`');
+
+            $job->execute();
+
+            $this->cronLogger->info('Job `' . $job->name() . '` executed successfully');
+        } catch (\Throwable $e) {
+            $this->cronLogger->critical('Error executing job `' . $message->getJobName() . '`: ' . $e->getMessage(), [
+                'exception' => $e,
+            ]);
+            throw $e;
+        }
+    }
+}

+ 16 - 0
src/Message/Message/CronJob.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Message\Message;
+
+class CronJob
+{
+    public function __construct(
+        private readonly string $jobName
+    ) {
+    }
+
+    public function getJobName(): string
+    {
+        return $this->jobName;
+    }
+}

+ 6 - 3
src/Schedule.php

@@ -2,7 +2,9 @@
 
 namespace App;
 
+use App\Message\Cron\CronJob;
 use Symfony\Component\Scheduler\Attribute\AsSchedule;
+use Symfony\Component\Scheduler\RecurringMessage;
 use Symfony\Component\Scheduler\Schedule as SymfonySchedule;
 use Symfony\Component\Scheduler\ScheduleProviderInterface;
 use Symfony\Contracts\Cache\CacheInterface;
@@ -21,8 +23,9 @@ class Schedule implements ScheduleProviderInterface
             ->stateful($this->cache) // ensure missed tasks are executed
             ->processOnlyLastMissedRun(true) // ensure only last missed task is run
 
-            // add your own tasks here
-            // see https://symfony.com/doc/current/scheduler.html#attaching-recurring-messages-to-a-schedule
-        ;
+            ->add(RecurringMessage::cron('30 23 * * *', new CronJob('clean-db')))
+            ->add(RecurringMessage::cron('40 23 * * *', new CronJob('dolibarr-sync')))
+            ->add(RecurringMessage::cron('50 23 * * *', new CronJob('clean-temp-files')))
+            ;
     }
 }