Closed
Description
Symfony version(s) affected
6.3.0
Description
I don't know if it's a bug or feature.
However if I'll put --time-limit in consumer command or I restart consumer during deployment it re-handles messages that shouldn't be re-handled (defined time has not yet passed)
How to reproduce
<?php
namespace App\Scheduler;
class TestMessage
{
}
<?php
namespace App\Scheduler;
use Psr\Log\LoggerInterface;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler]
class TestHandler
{
public function __construct(private LoggerInterface $logger)
{
}
public function __invoke(TestMessage $message)
{
$this->logger->error('Handling message', ['time' => time()]);
}
}
<?php
namespace App\Scheduler;
use Symfony\Component\Lock\LockFactory;
use Symfony\Component\Scheduler\Attribute\AsSchedule;
use Symfony\Component\Scheduler\RecurringMessage;
use Symfony\Component\Scheduler\Schedule;
use Symfony\Component\Scheduler\ScheduleProviderInterface;
use Symfony\Contracts\Cache\CacheInterface;
#[AsSchedule('test')]
class ScheduleProvider implements ScheduleProviderInterface
{
public function __construct(
private LockFactory $lockFactory,
private CacheInterface $cache,
) {
}
public function getSchedule(): Schedule
{
$schedule = new Schedule();
$schedule->lock($this->lockFactory->createLock('scheduler'));
$schedule->stateful($this->cache);
return $schedule->add(
RecurringMessage::every('30 seconds', new TestMessage()),
);
}
}
NOTE: in my local env lock and cache utilize redis
- Run
bin/console messenger:consume scheduler_test --time-limit=10 -v
- Run it again
Output 1st run
14:01:59 ERROR [app] Handling message ["time" => 1686830519]
Output 2nd run
14:02:11 ERROR [app] Handling message ["time" => 1686830531]
Only 12 seconds of difference, and message is registered as "every 30 seconds"
Possible Solution
No response