Skip to content

Commit 1e1ee8e

Browse files
authored
Merge pull request #193 from php-enqueue/queue-consumer-options
Queue Consumer Options
2 parents c5cb914 + 7b3af54 commit 1e1ee8e

19 files changed

+332
-32
lines changed

docs/bundle/cli_commands.md

+33-29
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,24 @@ Usage:
2020
enq:c
2121
2222
Arguments:
23-
client-queue-names Queues to consume messages from
23+
client-queue-names Queues to consume messages from
2424
2525
Options:
26-
--message-limit=MESSAGE-LIMIT Consume n messages and exit
27-
--time-limit=TIME-LIMIT Consume messages during this time
28-
--memory-limit=MEMORY-LIMIT Consume messages until process reaches this memory limit in MB
29-
--setup-broker Creates queues, topics, exchanges, binding etc on broker side.
30-
-h, --help Display this help message
31-
-q, --quiet Do not output any message
32-
-V, --version Display this application version
33-
--ansi Force ANSI output
34-
--no-ansi Disable ANSI output
35-
-n, --no-interaction Do not ask any interactive question
36-
-e, --env=ENV The environment name [default: "dev"]
37-
--no-debug Switches off debug mode
38-
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
26+
--message-limit=MESSAGE-LIMIT Consume n messages and exit
27+
--time-limit=TIME-LIMIT Consume messages during this time
28+
--memory-limit=MEMORY-LIMIT Consume messages until process reaches this memory limit in MB
29+
--setup-broker Creates queues, topics, exchanges, binding etc on broker side.
30+
--idle-timeout=IDLE-TIMEOUT The time in milliseconds queue consumer idle if no message has been received.
31+
--receive-timeout=RECEIVE-TIMEOUT The time in milliseconds queue consumer waits for a message.
32+
-h, --help Display this help message
33+
-q, --quiet Do not output any message
34+
-V, --version Display this application version
35+
--ansi Force ANSI output
36+
--no-ansi Disable ANSI output
37+
-n, --no-interaction Do not ask any interactive question
38+
-e, --env=ENV The environment name [default: "test"]
39+
--no-debug Switches off debug mode
40+
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
3941
4042
Help:
4143
A client's worker that processes messages. By default it connects to default queue. It select an appropriate message processor based on a message headers
@@ -143,26 +145,28 @@ Help:
143145

144146
```
145147
./bin/console enqueue:transport:consume --help
146-
Usage:
148+
Usage:ng mqdev_gearmand_1 ... done
147149
enqueue:transport:consume [options] [--] <processor-service>
148150
149151
Arguments:
150-
processor-service A message processor service
152+
processor-service A message processor service
151153
152154
Options:
153-
--message-limit=MESSAGE-LIMIT Consume n messages and exit
154-
--time-limit=TIME-LIMIT Consume messages during this time
155-
--memory-limit=MEMORY-LIMIT Consume messages until process reaches this memory limit in MB
156-
--queue[=QUEUE] Queues to consume from (multiple values allowed)
157-
-h, --help Display this help message
158-
-q, --quiet Do not output any message
159-
-V, --version Display this application version
160-
--ansi Force ANSI output
161-
--no-ansi Disable ANSI output
162-
-n, --no-interaction Do not ask any interactive question
163-
-e, --env=ENV The environment name [default: "dev"]
164-
--no-debug Switches off debug mode
165-
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
155+
--message-limit=MESSAGE-LIMIT Consume n messages and exit
156+
--time-limit=TIME-LIMIT Consume messages during this time
157+
--memory-limit=MEMORY-LIMIT Consume messages until process reaches this memory limit in MB
158+
--idle-timeout=IDLE-TIMEOUT The time in milliseconds queue consumer idle if no message has been received.
159+
--receive-timeout=RECEIVE-TIMEOUT The time in milliseconds queue consumer waits for a message.
160+
--queue[=QUEUE] Queues to consume from (multiple values allowed)
161+
-h, --help Display this help message
162+
-q, --quiet Do not output any message
163+
-V, --version Display this application version
164+
--ansi Force ANSI output
165+
--no-ansi Disable ANSI output
166+
-n, --no-interaction Do not ask any interactive question
167+
-e, --env=ENV The environment name [default: "test"]
168+
--no-debug Switches off debug mode
169+
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
166170
167171
Help:
168172
A worker that consumes message from a broker. To use this broker you have to explicitly set a queue to consume from and a message processor service

docs/bundle/config_reference.md

+9
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,13 @@ enqueue:
298298
router_processor: enqueue.client.router_processor
299299
default_processor_queue: default
300300
redelivered_delay_time: 0
301+
consumption:
302+
303+
# the time in milliseconds queue consumer waits if no message received
304+
idle_timeout: 0
305+
306+
# the time in milliseconds queue consumer waits for a message (100 ms by default)
307+
receive_timeout: 100
301308
job: false
302309
async_events:
303310
enabled: false
@@ -306,6 +313,8 @@ enqueue:
306313
doctrine_clear_identity_map_extension: false
307314
signal_extension: true
308315
reply_extension: true
316+
317+
309318
```
310319

311320
[back to index](../index.md)

pkg/enqueue-bundle/DependencyInjection/Configuration.php

+12
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,18 @@ public function getConfigTreeBuilder()
5050
->scalarNode('default_processor_queue')->defaultValue(Config::DEFAULT_PROCESSOR_QUEUE_NAME)->cannotBeEmpty()->end()
5151
->integerNode('redelivered_delay_time')->min(0)->defaultValue(0)->end()
5252
->end()->end()
53+
->arrayNode('consumption')->addDefaultsIfNotSet()->children()
54+
->integerNode('idle_timeout')
55+
->min(0)
56+
->defaultValue(0)
57+
->info('the time in milliseconds queue consumer waits if no message received')
58+
->end()
59+
->integerNode('receive_timeout')
60+
->min(0)
61+
->defaultValue(100)
62+
->info('the time in milliseconds queue consumer waits for a message (100 ms by default)')
63+
->end()
64+
->end()->end()
5365
->booleanNode('job')->defaultFalse()->end()
5466
->arrayNode('async_events')
5567
->addDefaultsIfNotSet()

pkg/enqueue-bundle/DependencyInjection/EnqueueExtension.php

+13
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,19 @@ public function load(array $configs, ContainerBuilder $container)
110110
}
111111
}
112112

113+
// configure queue consumer
114+
$container->getDefinition('enqueue.consumption.queue_consumer')
115+
->replaceArgument(2, $config['consumption']['idle_timeout'])
116+
->replaceArgument(3, $config['consumption']['receive_timeout'])
117+
;
118+
119+
if ($container->hasDefinition('enqueue.client.queue_consumer')) {
120+
$container->getDefinition('enqueue.client.queue_consumer')
121+
->replaceArgument(2, $config['consumption']['idle_timeout'])
122+
->replaceArgument(3, $config['consumption']['receive_timeout'])
123+
;
124+
}
125+
113126
if ($config['job']) {
114127
if (false == class_exists(Job::class)) {
115128
throw new \LogicException('Seems "enqueue/job-queue" is not installed. Please fix this issue.');

pkg/enqueue-bundle/Resources/config/client.yml

+2
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ services:
8585
arguments:
8686
- '@enqueue.transport.context'
8787
- '@enqueue.consumption.extensions'
88+
- ~
89+
- ~
8890

8991
enqueue.client.consume_messages_command:
9092
class: 'Enqueue\Symfony\Client\ConsumeMessagesCommand'

pkg/enqueue-bundle/Resources/config/services.yml

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ services:
1010
arguments:
1111
- '@enqueue.transport.context'
1212
- '@enqueue.consumption.extensions'
13+
- ~
14+
- ~
1315

1416
enqueue.command.consume_messages:
1517
class: 'Enqueue\Symfony\Consumption\ContainerAwareConsumeMessagesCommand'

pkg/enqueue-bundle/Tests/Unit/DependencyInjection/ConfigurationTest.php

+38
Original file line numberDiff line numberDiff line change
@@ -423,4 +423,42 @@ public function testShouldAllowEnableAsyncEvents()
423423
],
424424
], $config);
425425
}
426+
427+
public function testShouldSetDefaultConfigurationForConsumption()
428+
{
429+
$configuration = new Configuration([]);
430+
431+
$processor = new Processor();
432+
$config = $processor->processConfiguration($configuration, [[
433+
'transport' => [],
434+
]]);
435+
436+
$this->assertArraySubset([
437+
'consumption' => [
438+
'idle_timeout' => 0,
439+
'receive_timeout' => 100,
440+
],
441+
], $config);
442+
}
443+
444+
public function testShouldAllowConfigureConsumption()
445+
{
446+
$configuration = new Configuration([]);
447+
448+
$processor = new Processor();
449+
$config = $processor->processConfiguration($configuration, [[
450+
'transport' => [],
451+
'consumption' => [
452+
'idle_timeout' => 123,
453+
'receive_timeout' => 456,
454+
],
455+
]]);
456+
457+
$this->assertArraySubset([
458+
'consumption' => [
459+
'idle_timeout' => 123,
460+
'receive_timeout' => 456,
461+
],
462+
], $config);
463+
}
426464
}

pkg/enqueue-bundle/Tests/Unit/DependencyInjection/EnqueueExtensionTest.php

+24
Original file line numberDiff line numberDiff line change
@@ -535,4 +535,28 @@ public function testShouldNotAddJobQueueEntityMappingIfDoctrineBundleIsNotRegist
535535

536536
$this->assertSame([], $container->getExtensionConfig('doctrine'));
537537
}
538+
539+
public function testShouldConfigureQueueConsumer()
540+
{
541+
$container = new ContainerBuilder();
542+
543+
$extension = new EnqueueExtension();
544+
$extension->load([[
545+
'client' => [],
546+
'transport' => [
547+
],
548+
'consumption' => [
549+
'idle_timeout' => 123,
550+
'receive_timeout' => 456,
551+
],
552+
]], $container);
553+
554+
$def = $container->getDefinition('enqueue.consumption.queue_consumer');
555+
$this->assertSame(123, $def->getArgument(2));
556+
$this->assertSame(456, $def->getArgument(3));
557+
558+
$def = $container->getDefinition('enqueue.client.queue_consumer');
559+
$this->assertSame(123, $def->getArgument(2));
560+
$this->assertSame(456, $def->getArgument(3));
561+
}
538562
}

pkg/enqueue/Consumption/QueueConsumer.php

+32
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,38 @@ public function __construct(
6363
$this->boundProcessors = [];
6464
}
6565

66+
/**
67+
* @param int $timeout
68+
*/
69+
public function setIdleTimeout($timeout)
70+
{
71+
$this->idleTimeout = (int) $timeout;
72+
}
73+
74+
/**
75+
* @return int
76+
*/
77+
public function getIdleTimeout()
78+
{
79+
return $this->idleTimeout;
80+
}
81+
82+
/**
83+
* @param int $timeout
84+
*/
85+
public function setReceiveTimeout($timeout)
86+
{
87+
$this->receiveTimeout = (int) $timeout;
88+
}
89+
90+
/**
91+
* @return int
92+
*/
93+
public function getReceiveTimeout()
94+
{
95+
return $this->receiveTimeout;
96+
}
97+
6698
/**
6799
* @return PsrContext
68100
*/

pkg/enqueue/Symfony/Client/ConsumeMessagesCommand.php

+5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Enqueue\Consumption\Extension\LoggerExtension;
1010
use Enqueue\Consumption\QueueConsumer;
1111
use Enqueue\Symfony\Consumption\LimitsExtensionsCommandTrait;
12+
use Enqueue\Symfony\Consumption\QueueConsumerOptionsCommandTrait;
1213
use Symfony\Component\Console\Command\Command;
1314
use Symfony\Component\Console\Input\InputArgument;
1415
use Symfony\Component\Console\Input\InputInterface;
@@ -19,6 +20,7 @@ class ConsumeMessagesCommand extends Command
1920
{
2021
use LimitsExtensionsCommandTrait;
2122
use SetupBrokerExtensionCommandTrait;
23+
use QueueConsumerOptionsCommandTrait;
2224

2325
/**
2426
* @var QueueConsumer
@@ -67,6 +69,7 @@ protected function configure()
6769
{
6870
$this->configureLimitsExtensions();
6971
$this->configureSetupBrokerExtension();
72+
$this->configureQueueConsumerOptions();
7073

7174
$this
7275
->setName('enqueue:consume')
@@ -83,6 +86,8 @@ protected function configure()
8386
*/
8487
protected function execute(InputInterface $input, OutputInterface $output)
8588
{
89+
$this->setQueueConsumerOptions($this->consumer, $input);
90+
8691
$queueMetas = [];
8792
if ($clientQueueNames = $input->getArgument('client-queue-names')) {
8893
foreach ($clientQueueNames as $clientQueueName) {

pkg/enqueue/Symfony/Consumption/ConsumeMessagesCommand.php

+4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class ConsumeMessagesCommand extends Command implements ContainerAwareInterface
1616
{
1717
use ContainerAwareTrait;
1818
use LimitsExtensionsCommandTrait;
19+
use QueueConsumerOptionsCommandTrait;
1920

2021
/**
2122
* @var QueueConsumer
@@ -38,6 +39,7 @@ public function __construct(QueueConsumer $consumer)
3839
protected function configure()
3940
{
4041
$this->configureLimitsExtensions();
42+
$this->configureQueueConsumerOptions();
4143

4244
$this
4345
->setName('enqueue:transport:consume')
@@ -51,6 +53,8 @@ protected function configure()
5153
*/
5254
protected function execute(InputInterface $input, OutputInterface $output)
5355
{
56+
$this->setQueueConsumerOptions($this->consumer, $input);
57+
5458
$extensions = $this->getLimitsExtensions($input, $output);
5559
array_unshift($extensions, new LoggerExtension(new ConsoleLogger($output)));
5660

pkg/enqueue/Symfony/Consumption/ContainerAwareConsumeMessagesCommand.php

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class ContainerAwareConsumeMessagesCommand extends Command implements ContainerA
2020
{
2121
use ContainerAwareTrait;
2222
use LimitsExtensionsCommandTrait;
23+
use QueueConsumerOptionsCommandTrait;
2324

2425
/**
2526
* @var QueueConsumer
@@ -44,6 +45,7 @@ public function __construct(QueueConsumer $consumer)
4445
protected function configure()
4546
{
4647
$this->configureLimitsExtensions();
48+
$this->configureQueueConsumerOptions();
4749

4850
$this
4951
->setName('enqueue:transport:consume')
@@ -60,6 +62,8 @@ protected function configure()
6062
*/
6163
protected function execute(InputInterface $input, OutputInterface $output)
6264
{
65+
$this->setQueueConsumerOptions($this->consumer, $input);
66+
6367
/** @var PsrProcessor $processor */
6468
$processor = $this->container->get($input->getArgument('processor-service'));
6569
if (false == $processor instanceof PsrProcessor) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace Enqueue\Symfony\Consumption;
4+
5+
use Enqueue\Consumption\QueueConsumer;
6+
use Symfony\Component\Console\Input\InputInterface;
7+
use Symfony\Component\Console\Input\InputOption;
8+
9+
trait QueueConsumerOptionsCommandTrait
10+
{
11+
/**
12+
* {@inheritdoc}
13+
*/
14+
protected function configureQueueConsumerOptions()
15+
{
16+
$this
17+
->addOption('idle-timeout', null, InputOption::VALUE_REQUIRED, 'The time in milliseconds queue consumer idle if no message has been received.')
18+
->addOption('receive-timeout', null, InputOption::VALUE_REQUIRED, 'The time in milliseconds queue consumer waits for a message.')
19+
;
20+
}
21+
22+
/**
23+
* @param QueueConsumer $consumer
24+
* @param InputInterface $input
25+
*/
26+
protected function setQueueConsumerOptions(QueueConsumer $consumer, InputInterface $input)
27+
{
28+
if (null !== $idleTimeout = $input->getOption('idle-timeout')) {
29+
$consumer->setIdleTimeout((int) $idleTimeout);
30+
}
31+
32+
if (null !== $receiveTimeout = $input->getOption('receive-timeout')) {
33+
$consumer->setReceiveTimeout((int) $receiveTimeout);
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)