Код: Выделить всё
framework:
messenger:
transports:
async: '%env(MESSENGER_TRANSPORT_DSN)%'
failed: 'doctrine://default?table_name=failed_messages'
sql_channel_manager_dlq:
dsn: '%env(SQS_CHANNEL_MANAGER_TRANSPORT_DLQ_DSN)%'
options:
access_key: '%env(AWS_ACCESS_KEY_ID)%'
secret_key: '%env(AWS_SECRET_ACCESS_KEY)%'
region: '%env(AWS_REGION)%'
queue_name: '%env(CHANNEL_MANAGER_QUEUE_NAME_DLQ)%'
sqs_channel_manager:
failure_transport: sql_channel_manager_dlq
dsn: '%env(SQS_CHANNEL_MANAGER_TRANSPORT_DSN)%'
serializer: App\Infrastructure\Messenger\ChannelManagerSerializer
options:
access_key: '%env(AWS_ACCESS_KEY_ID)%'
secret_key: '%env(AWS_SECRET_ACCESS_KEY)%'
region: '%env(AWS_REGION)%'
queue_name: '%env(CHANNEL_MANAGER_QUEUE_NAME)%'
failure_transport: failed
default_bus: command.bus
buses:
event.bus: ~
command.bus:
middleware:
- 'App\Infrastructure\Middleware\RequestIdMiddleware'
routing:
App\Message\TestQueue: async
App\Domain\Event\ChannelManager\ChannelManagerEventHasReceived: sqs_channel_manager
Код: Выделить всё
declare(strict_types=1);
namespace App\Infrastructure\Messenger;
use App\Domain\Event\ChannelManager\ChannelManagerEventHasReceived;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Stamp\RedeliveryStamp;
use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp;
use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
class ChannelManagerSerializer implements SerializerInterface
{
public function decode(array $encodedEnvelope): Envelope
{
$data = json_decode($encodedEnvelope['body'], true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \InvalidArgumentException(
'Invalid JSON received from SQS: ' . json_last_error_msg()
);
}
$envelope = new Envelope(new ChannelManagerEventHasReceived($data));
if (!empty($encodedEnvelope['headers']['stamps'])) {
$stamps = unserialize(base64_decode($encodedEnvelope['headers']['stamps']));
foreach ($stamps as $stamp) {
$envelope = $envelope->with($stamp);
}
}
return $envelope;
}
public function encode(Envelope $envelope): array
{
$event = $envelope->getMessage();
$stampsToSerialize = [];
foreach ($envelope->all() as $stampArray) {
foreach ($stampArray as $stamp) {
if ($stamp instanceof RedeliveryStamp || $stamp instanceof TransportMessageIdStamp) {
$stampsToSerialize[] = $stamp;
}
}
}
return [
'body' => json_encode($event->channelManagerData, JSON_THROW_ON_ERROR),
'headers' => [
'stamps' => base64_encode(serialize($stampsToSerialize)),
],
];
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ecific-bus