3
3
namespace Enqueue \Client \ConsumptionExtension ;
4
4
5
5
use Enqueue \Client \Config ;
6
- use Enqueue \Client \EmptyExtensionTrait as ClientEmptyExtensionTrait ;
7
- use Enqueue \Client \ExtensionInterface as ClientExtensionInterface ;
8
- use Enqueue \Client \PreSend ;
6
+ use Enqueue \Client \DriverInterface ;
7
+ use Enqueue \Client \Route ;
9
8
use Enqueue \Consumption \Context ;
10
9
use Enqueue \Consumption \EmptyExtensionTrait as ConsumptionEmptyExtensionTrait ;
11
10
use Enqueue \Consumption \ExtensionInterface as ConsumptionExtensionInterface ;
12
11
13
- final class ExclusiveCommandExtension implements ConsumptionExtensionInterface, ClientExtensionInterface
12
+ final class ExclusiveCommandExtension implements ConsumptionExtensionInterface
14
13
{
15
- use ConsumptionEmptyExtensionTrait, ClientEmptyExtensionTrait ;
14
+ use ConsumptionEmptyExtensionTrait;
16
15
17
16
/**
18
- * @var string[]
17
+ * @var DriverInterface
19
18
*/
20
- private $ queueNameToProcessorNameMap ;
19
+ private $ driver ;
21
20
22
21
/**
23
- * @var string []
22
+ * @var Route []
24
23
*/
25
- private $ processorNameToQueueNameMap ;
24
+ private $ queueToRouteMap ;
26
25
27
- /**
28
- * @param string[] $queueNameToProcessorNameMap
29
- */
30
- public function __construct (array $ queueNameToProcessorNameMap )
26
+ public function __construct (DriverInterface $ driver )
31
27
{
32
- $ this ->queueNameToProcessorNameMap = $ queueNameToProcessorNameMap ;
33
- $ this ->processorNameToQueueNameMap = array_flip ($ queueNameToProcessorNameMap );
28
+ $ this ->driver = $ driver ;
34
29
}
35
30
36
31
public function onPreReceived (Context $ context )
@@ -41,34 +36,46 @@ public function onPreReceived(Context $context)
41
36
if ($ message ->getProperty (Config::PARAMETER_TOPIC_NAME )) {
42
37
return ;
43
38
}
44
- if ($ message ->getProperty (Config::PARAMETER_PROCESSOR_QUEUE_NAME )) {
39
+ if ($ message ->getProperty (Config::PARAMETER_COMMAND_NAME )) {
45
40
return ;
46
41
}
47
42
if ($ message ->getProperty (Config::PARAMETER_PROCESSOR_NAME )) {
48
43
return ;
49
44
}
50
- if ($ message ->getProperty (Config::PARAMETER_COMMAND_NAME )) {
51
- return ;
45
+
46
+ if (null === $ this ->queueToRouteMap ) {
47
+ $ this ->queueToRouteMap = $ this ->buildMap ();
52
48
}
53
49
54
- if (array_key_exists ($ queue ->getQueueName (), $ this ->queueNameToProcessorNameMap )) {
50
+ if (array_key_exists ($ queue ->getQueueName (), $ this ->queueToRouteMap )) {
55
51
$ context ->getLogger ()->debug ('[ExclusiveCommandExtension] This is a exclusive command queue and client \'s properties are not set. Setting them ' );
56
52
57
- $ message ->setProperty (Config::PARAMETER_TOPIC_NAME , Config::COMMAND_TOPIC );
58
- $ message ->setProperty (Config::PARAMETER_PROCESSOR_QUEUE_NAME , $ queue ->getQueueName ());
59
- $ message ->setProperty (Config::PARAMETER_PROCESSOR_NAME , $ this ->queueNameToProcessorNameMap [$ queue ->getQueueName ()]);
60
- $ message ->setProperty (Config::PARAMETER_COMMAND_NAME , $ this ->queueNameToProcessorNameMap [$ queue ->getQueueName ()]);
53
+ $ route = $ this ->queueToRouteMap [$ queue ->getQueueName ()];
54
+ $ message ->setProperty (Config::PARAMETER_PROCESSOR_NAME , $ route ->getProcessor ());
55
+ $ message ->setProperty (Config::PARAMETER_COMMAND_NAME , $ route ->getSource ());
61
56
}
62
57
}
63
58
64
- public function onPreSendCommand ( PreSend $ context ): void
59
+ private function buildMap ( ): array
65
60
{
66
- $ message = $ context ->getMessage ();
67
- $ command = $ context ->getCommand ();
61
+ $ map = [];
62
+ foreach ($ this ->driver ->getRouteCollection ()->all () as $ route ) {
63
+ if (false == $ route ->isCommand ()) {
64
+ continue ;
65
+ }
66
+
67
+ if (false == $ route ->isProcessorExclusive ()) {
68
+ continue ;
69
+ }
68
70
69
- if (array_key_exists ($ command , $ this ->processorNameToQueueNameMap )) {
70
- $ message ->setProperty (Config::PARAMETER_PROCESSOR_NAME , $ command );
71
- $ message ->setProperty (Config::PARAMETER_PROCESSOR_QUEUE_NAME , $ this ->processorNameToQueueNameMap [$ command ]);
71
+ $ queueName = $ this ->driver ->createQueue ($ route ->getQueue ())->getQueueName ();
72
+ if (array_key_exists ($ queueName , $ map )) {
73
+ throw new \LogicException ('The queue name has been already bound by another exclusive command processor ' );
74
+ }
75
+
76
+ $ map [$ queueName ] = $ route ;
72
77
}
78
+
79
+ return $ map ;
73
80
}
74
81
}
0 commit comments