|
11 | 11 |
|
12 | 12 | namespace Symfony\Component\Messenger\Middleware;
|
13 | 13 |
|
| 14 | +use Psr\Log\LoggerAwareTrait; |
| 15 | +use Psr\Log\NullLogger; |
14 | 16 | use Symfony\Component\Messenger\Envelope;
|
15 | 17 | use Symfony\Component\Messenger\Stamp\ReceivedStamp;
|
16 | 18 | use Symfony\Component\Messenger\Stamp\SentStamp;
|
|
24 | 26 | */
|
25 | 27 | class SendMessageMiddleware implements MiddlewareInterface
|
26 | 28 | {
|
| 29 | + use LoggerAwareTrait; |
| 30 | + |
27 | 31 | private $sendersLocator;
|
28 | 32 |
|
29 | 33 | public function __construct(SendersLocatorInterface $sendersLocator)
|
30 | 34 | {
|
31 | 35 | $this->sendersLocator = $sendersLocator;
|
| 36 | + $this->logger = new NullLogger(); |
32 | 37 | }
|
33 | 38 |
|
34 | 39 | /**
|
35 | 40 | * {@inheritdoc}
|
36 | 41 | */
|
37 | 42 | public function handle(Envelope $envelope, StackInterface $stack): Envelope
|
38 | 43 | {
|
39 |
| - if ($envelope->all(ReceivedStamp::class)) { |
40 |
| - // it's a received message, do not send it back |
41 |
| - return $stack->next()->handle($envelope, $stack); |
42 |
| - } |
| 44 | + $context = [ |
| 45 | + 'message' => $envelope->getMessage(), |
| 46 | + 'class' => \get_class($envelope->getMessage()), |
| 47 | + ]; |
| 48 | + |
43 | 49 | $handle = false;
|
44 | 50 | $sender = null;
|
45 | 51 |
|
46 |
| - foreach ($this->sendersLocator->getSenders($envelope, $handle) as $alias => $sender) { |
47 |
| - $envelope = $sender->send($envelope)->with(new SentStamp(\get_class($sender), \is_string($alias) ? $alias : null)); |
| 52 | + if ($envelope->all(ReceivedStamp::class)) { |
| 53 | + // it's a received message, do not send it back |
| 54 | + $this->logger->debug('Received message "{class}"', $context); |
| 55 | + } else { |
| 56 | + foreach ($this->sendersLocator->getSenders($envelope, $handle) as $alias => $sender) { |
| 57 | + $this->logger->debug('Sending message "{class}" with "{sender}"', $context + ['sender' => \get_class($sender)]); |
| 58 | + $envelope = $sender->send($envelope)->with(new SentStamp(\get_class($sender), \is_string($alias) ? $alias : null)); |
| 59 | + } |
48 | 60 | }
|
49 | 61 |
|
50 | 62 | if (null === $sender || $handle) {
|
51 |
| - return $stack->next()->handle($envelope, $stack); |
| 63 | + try { |
| 64 | + return $stack->next()->handle($envelope, $stack); |
| 65 | + } catch (\Throwable $e) { |
| 66 | + $context['exception'] = $e; |
| 67 | + $this->logger->warning('An exception occurred while handling message "{class}"', $context); |
| 68 | + |
| 69 | + throw $e; |
| 70 | + } |
52 | 71 | }
|
53 | 72 |
|
54 | 73 | // message should only be sent and not be handled by the next middleware
|
|
0 commit comments