-
-
Notifications
You must be signed in to change notification settings - Fork 32
Expand file tree
/
Copy pathQueueConsumer.php
More file actions
64 lines (56 loc) · 2.1 KB
/
Copy pathQueueConsumer.php
File metadata and controls
64 lines (56 loc) · 2.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?php
declare(strict_types=1);
namespace Yiisoft\Queue;
use BackedEnum;
use Psr\Log\LoggerInterface;
use Yiisoft\Queue\Adapter\AdapterInterface;
use Yiisoft\Queue\Cli\LoopInterface;
use Yiisoft\Queue\Message\MessageInterface;
use Yiisoft\Queue\Worker\WorkerInterface;
/** Consumes messages for one logical queue. */
final class QueueConsumer implements QueueConsumerInterface
{
private string $queueName;
public function __construct(
private readonly WorkerInterface $worker,
private readonly LoopInterface $loop,
private readonly LoggerInterface $logger,
private readonly ?AdapterInterface $adapter = null,
string|BackedEnum $queueName = DefaultQueue::NAME,
) {
$this->queueName = StringNormalizer::normalize($queueName);
}
public function run(int $max = 0): int
{
if ($this->adapter === null) {
$this->logger->debug('Queue is in synchronous mode (no adapter). Messages are processed on push. run() does nothing.');
return 0;
}
$this->logger->debug('Start processing queue messages.');
$count = 0;
$this->adapter->runExisting(function (MessageInterface $message) use (&$count, $max): bool {
if (($max > 0 && $count >= $max) || !$this->handle($message)) {
return false;
}
$count++;
return true;
});
$this->logger->info('Processed {count} queue messages.', ['count' => $count]);
return $count;
}
public function listen(): void
{
if ($this->adapter === null) {
$this->logger->info('Cannot listen without an adapter. Queue is in synchronous mode.');
return;
}
$this->logger->info('Start listening to the queue.');
$this->adapter->subscribe(fn(MessageInterface $message): bool => $this->handle($message));
$this->logger->info('Finish listening to the queue.');
}
private function handle(MessageInterface $message): bool
{
$this->worker->process($message, $this->queueName);
return $this->loop->canContinue();
}
}