Skip to content

Commit cdc4635

Browse files
committed
feature #31454 [Messenger] remove send_and_handle which can be achieved with SyncTransport (Tobion)
This PR was merged into the 4.3 branch. Discussion ---------- [Messenger] remove send_and_handle which can be achieved with SyncTransport | Q | A | ------------- | --- | Branch? | 4.3 | Bug fix? | no | New feature? | yes/no <!-- please update src/**/CHANGELOG.md files --> | BC breaks? | yes <!-- see https://symfony.com/bc --> | Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files --> | Tests pass? | yes <!-- please add some, will be required by reviewers --> | Fixed tickets | | License | MIT | Doc PR | symfony/symfony-docs#11236 The send_and_handle option is pretty awkward and we don't need it anymore because the same thing can be achieved with the SyncTransport from #30759 So the following example from the doc in https://symfony.com/doc/current/messenger.html#routing ```yaml framework: messenger: routing: 'My\Message\ThatIsGoingToBeSentAndHandledLocally': senders: [amqp] send_and_handle: true ``` is the same as ```yaml framework: messenger: routing: 'My\Message\ThatIsGoingToBeSentAndHandledLocally': senders: [amqp, sync] ``` symfony/symfony#31401 (review) Commits ------- 4552b7f5b2 [Messenger] remove send_and_handle option which can be achieved with SyncTransport
2 parents fb67380 + 3d83ee3 commit cdc4635

File tree

5 files changed

+20
-66
lines changed

5 files changed

+20
-66
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ CHANGELOG
66

77
* [BC BREAK] `SendersLocatorInterface` has an additional method:
88
`getSenderByAlias()`.
9+
* Removed argument `?bool &$handle = false` from `SendersLocatorInterface::getSenders`
910
* A new `ListableReceiverInterface` was added, which a receiver
1011
can implement (when applicable) to enable listing and fetching
1112
individual messages by id (used in the new "Failed Messages" commands).

Middleware/SendMessageMiddleware.php

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
5252
'class' => \get_class($envelope->getMessage()),
5353
];
5454

55-
$handle = false;
5655
$sender = null;
5756

5857
try {
@@ -65,7 +64,7 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
6564

6665
// dispatch event unless this is a redelivery
6766
$shouldDispatchEvent = null === $redeliveryStamp;
68-
foreach ($this->getSenders($envelope, $handle, $redeliveryStamp) as $alias => $sender) {
67+
foreach ($this->getSenders($envelope, $redeliveryStamp) as $alias => $sender) {
6968
if (null !== $this->eventDispatcher && $shouldDispatchEvent) {
7069
$event = new SendMessageToTransportsEvent($envelope);
7170
$this->eventDispatcher->dispatch($event);
@@ -76,14 +75,9 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
7675
$this->logger->info('Sending message "{class}" with "{sender}"', $context + ['sender' => \get_class($sender)]);
7776
$envelope = $sender->send($envelope->with(new SentStamp(\get_class($sender), \is_string($alias) ? $alias : null)));
7877
}
79-
80-
// on a redelivery, only send back to queue: never call local handlers
81-
if (null !== $redeliveryStamp) {
82-
$handle = false;
83-
}
8478
}
8579

86-
if (null === $sender || $handle) {
80+
if (null === $sender) {
8781
return $stack->next()->handle($envelope, $stack);
8882
}
8983
} catch (\Throwable $e) {
@@ -100,14 +94,14 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
10094
/**
10195
* * @return iterable|SenderInterface[]
10296
*/
103-
private function getSenders(Envelope $envelope, &$handle, ?RedeliveryStamp $redeliveryStamp): iterable
97+
private function getSenders(Envelope $envelope, ?RedeliveryStamp $redeliveryStamp): iterable
10498
{
10599
if (null !== $redeliveryStamp) {
106100
return [
107101
$redeliveryStamp->getSenderClassOrAlias() => $this->sendersLocator->getSenderByAlias($redeliveryStamp->getSenderClassOrAlias()),
108102
];
109103
}
110104

111-
return $this->sendersLocator->getSenders($envelope, $handle);
105+
return $this->sendersLocator->getSenders($envelope);
112106
}
113107
}

Tests/Middleware/SendMessageMiddlewareTest.php

Lines changed: 12 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,7 @@ public function testItSendsToOnlyOneSenderOnRedelivery()
9292

9393
$sendersLocator = $this->createSendersLocator(
9494
[DummyMessage::class => ['foo', 'bar']],
95-
['foo' => $sender, 'bar' => $sender2],
96-
[
97-
// normally, this class sends and handles (but not on retry)
98-
DummyMessage::class => true,
99-
]
95+
['foo' => $sender, 'bar' => $sender2]
10096
);
10197

10298
$middleware = new SendMessageMiddleware($sendersLocator);
@@ -126,68 +122,46 @@ public function testItSendsTheMessageToAssignedSenderWithPreWrappedMessage()
126122
$middleware->handle($envelope, $this->getStackMock(false));
127123
}
128124

129-
public function testItAlsoCallsTheNextMiddlewareBasedOnTheMessageClass()
130-
{
131-
$message = new DummyMessage('Hey');
132-
$envelope = new Envelope($message);
133-
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
134-
135-
$sendersLocator = $this->createSendersLocator(['*' => ['foo_sender']], ['foo_sender' => $sender], [
136-
DummyMessage::class => true,
137-
]);
138-
$middleware = new SendMessageMiddleware($sendersLocator);
139-
140-
$sender->expects($this->once())->method('send')->with($envelope->with(new SentStamp(\get_class($sender), 'foo_sender')))->willReturn($envelope);
141-
142-
$middleware->handle($envelope, $this->getStackMock());
143-
}
144-
145-
public function testItAlsoCallsTheNextMiddlewareBasedOnTheMessageParentClass()
125+
public function testItSendsTheMessageBasedOnTheMessageParentClass()
146126
{
147127
$message = new ChildDummyMessage('Hey');
148128
$envelope = new Envelope($message);
149129
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
150130

151-
$sendersLocator = $this->createSendersLocator(['*' => ['foo_sender']], ['foo_sender' => $sender], [
152-
DummyMessage::class => true,
153-
]);
131+
$sendersLocator = $this->createSendersLocator([DummyMessage::class => ['foo_sender']], ['foo_sender' => $sender]);
154132
$middleware = new SendMessageMiddleware($sendersLocator);
155133

156134
$sender->expects($this->once())->method('send')->with($envelope->with(new SentStamp(\get_class($sender), 'foo_sender')))->willReturn($envelope);
157135

158-
$middleware->handle($envelope, $this->getStackMock());
136+
$middleware->handle($envelope, $this->getStackMock(false));
159137
}
160138

161-
public function testItAlsoCallsTheNextMiddlewareBasedOnTheMessageInterface()
139+
public function testItSendsTheMessageBasedOnTheMessageInterface()
162140
{
163141
$message = new DummyMessage('Hey');
164142
$envelope = new Envelope($message);
165143
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
166144

167-
$sendersLocator = $this->createSendersLocator(['*' => ['foo_sender']], ['foo_sender' => $sender], [
168-
DummyMessageInterface::class => true,
169-
]);
145+
$sendersLocator = $this->createSendersLocator([DummyMessageInterface::class => ['foo_sender']], ['foo_sender' => $sender]);
170146
$middleware = new SendMessageMiddleware($sendersLocator);
171147

172148
$sender->expects($this->once())->method('send')->with($envelope->with(new SentStamp(\get_class($sender), 'foo_sender')))->willReturn($envelope);
173149

174-
$middleware->handle($envelope, $this->getStackMock());
150+
$middleware->handle($envelope, $this->getStackMock(false));
175151
}
176152

177-
public function testItAlsoCallsTheNextMiddlewareBasedOnWildcard()
153+
public function testItSendsTheMessageBasedOnWildcard()
178154
{
179155
$message = new DummyMessage('Hey');
180156
$envelope = new Envelope($message);
181157
$sender = $this->getMockBuilder(SenderInterface::class)->getMock();
182158

183-
$sendersLocator = $this->createSendersLocator(['*' => ['foo_sender']], ['foo_sender' => $sender], [
184-
'*' => true,
185-
]);
159+
$sendersLocator = $this->createSendersLocator(['*' => ['foo_sender']], ['foo_sender' => $sender]);
186160
$middleware = new SendMessageMiddleware($sendersLocator);
187161

188162
$sender->expects($this->once())->method('send')->with($envelope->with(new SentStamp(\get_class($sender), 'foo_sender')))->willReturn($envelope);
189163

190-
$middleware->handle($envelope, $this->getStackMock());
164+
$middleware->handle($envelope, $this->getStackMock(false));
191165
}
192166

193167
public function testItCallsTheNextMiddlewareWhenNoSenderForThisMessage()
@@ -267,7 +241,7 @@ public function testItDoesNotDispatchOnRedeliver()
267241
$middleware->handle($envelope, $this->getStackMock(false));
268242
}
269243

270-
private function createSendersLocator(array $sendersMap, array $senders, array $sendAndHandle = [])
244+
private function createSendersLocator(array $sendersMap, array $senders)
271245
{
272246
$container = $this->createMock(ContainerInterface::class);
273247
$container->expects($this->any())
@@ -281,6 +255,6 @@ private function createSendersLocator(array $sendersMap, array $senders, array $
281255
return $senders[$id];
282256
});
283257

284-
return new SendersLocator($sendersMap, $container, $sendAndHandle);
258+
return new SendersLocator($sendersMap, $container);
285259
}
286260
}

Transport/Sender/SendersLocator.php

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,36 +30,30 @@ class SendersLocator implements SendersLocatorInterface
3030
private $sendersMap;
3131
private $sendersLocator;
3232
private $useLegacyLookup = false;
33-
private $sendAndHandle;
3433

3534
/**
3635
* @param string[][] $sendersMap An array, keyed by "type", set to an array of sender aliases
3736
* @param ContainerInterface $sendersLocator Locator of senders, keyed by sender alias
38-
* @param bool[] $sendAndHandle
3937
*/
40-
public function __construct(array $sendersMap, /*ContainerInterface*/ $sendersLocator = null, array $sendAndHandle = [])
38+
public function __construct(array $sendersMap, /*ContainerInterface*/ $sendersLocator = null)
4139
{
4240
$this->sendersMap = $sendersMap;
4341

4442
if (\is_array($sendersLocator) || null === $sendersLocator) {
4543
@trigger_error(sprintf('"%s::__construct()" requires a "%s" as 2nd argument. Not doing so is deprecated since Symfony 4.3 and will be required in 5.0.', __CLASS__, ContainerInterface::class), E_USER_DEPRECATED);
4644
// "%s" requires a "%s" as 2nd argument. Not doing so is deprecated since Symfony 4.3 and will be required in 5.0.'
4745
$this->sendersLocator = new ServiceLocator([]);
48-
$this->sendAndHandle = $sendersLocator;
4946
$this->useLegacyLookup = true;
5047
} else {
5148
$this->sendersLocator = $sendersLocator;
52-
$this->sendAndHandle = $sendAndHandle;
5349
}
5450
}
5551

5652
/**
5753
* {@inheritdoc}
5854
*/
59-
public function getSenders(Envelope $envelope, ?bool &$handle = false): iterable
55+
public function getSenders(Envelope $envelope): iterable
6056
{
61-
$handle = false;
62-
$sender = null;
6357
$seen = [];
6458

6559
foreach (HandlersLocator::listTypes($envelope) as $type) {
@@ -71,8 +65,6 @@ public function getSenders(Envelope $envelope, ?bool &$handle = false): iterable
7165
}
7266
}
7367

74-
$handle = $handle ?: $this->sendAndHandle[$type] ?? false;
75-
7668
continue;
7769
}
7870

@@ -87,11 +79,7 @@ public function getSenders(Envelope $envelope, ?bool &$handle = false): iterable
8779
yield $senderAlias => $sender;
8880
}
8981
}
90-
91-
$handle = $handle ?: $this->sendAndHandle[$type] ?? false;
9282
}
93-
94-
$handle = $handle || null === $sender;
9583
}
9684

9785
public function getSenderByAlias(string $alias): SenderInterface

Transport/Sender/SendersLocatorInterface.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,9 @@ interface SendersLocatorInterface
2727
/**
2828
* Gets the senders for the given message name.
2929
*
30-
* @param bool|null &$handle True after calling the method when the next middleware
31-
* should also get the message; false otherwise
32-
*
3330
* @return iterable|SenderInterface[] Indexed by sender alias if available
3431
*/
35-
public function getSenders(Envelope $envelope, ?bool &$handle = false): iterable;
32+
public function getSenders(Envelope $envelope): iterable;
3633

3734
/**
3835
* Returns a specific sender by its alias.

0 commit comments

Comments
 (0)