Ce qui se passe
Quand un transport Messenger relie Symfony à un service tiers, un service de
facturation en Go branché sur RabbitMQ par exemple, le sérialiseur Symfony joint les
stamps au message. Cela pose deux problèmes côté réception : un stamp dont la classe
manque ne se décode pas, et un BusNameStamp peut viser un bus inexistant.
Symfony 8.2 fournit le service messenger.transport.interop_serializer. À l'envoi
il retire les stamps, à la réception il les ignore. Reste un corps JSON et quelques
en-têtes simples. Seule exception : les messages renvoyés pour une nouvelle tentative
ou vers le transport d'échec gardent leurs stamps, pour le comptage des essais.
Comment s'y prendre
Déclarez-le sur le transport partagé, dans chaque application Symfony qui l'utilise :
framework:
messenger:
transports:
commandes:
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
serializer: messenger.transport.interop_serializerRemplacez ensuite la classe PHP de l'en-tête type par un nom stable, identique des
deux côtés si l'autre application utilise aussi Messenger :
#[AsMessage(serializedTypeName: 'shop.order_placed')]
final class OrderPlaced {}Si l'émetteur n'envoie aucun type (un service Python ou Node.js, par exemple), le
transport accepte une classe fixe, ou une closure qui reçoit corps et en-têtes et
renvoie le type, ou null. La syntaxe exacte figure dans le billet : ses exemples de
configuration n'ont pas pu être relus pour cette fiche, et le bloc YAML ci-dessus reste
la forme habituelle de Messenger.
Ne pas perdre l'identité du message
Sans stamps, chaque redélivraison recevrait un nouvel identifiant, et le destinataire ne reconnaîtrait plus un doublon. Les stamp header mappers y remédient :
| Stamp | En-tête |
|---|---|
MessageIdStamp |
message_id |
CorrelationStamp |
correlation_id |
CausationStamp |
causation_id |
Ces stamps n'existent qu'avec l'option identity_stamps. Pour transmettre un
identifiant de client, implémentez StampHeaderMapperInterface : l'autoconfiguration
branche votre classe sur le sérialiseur.
Le piège de la signature
Sur un transport signé, la signature porte sur tous les en-têtes écrits par le
sérialiseur, sauf Content-Type, y compris ceux de vos mappers. Ceux ajoutés après
sérialisation ne comptent pas.
Mais Symfony 7.4.18+ et 8.1.6+ rejettent les messages signés dont les en-têtes ne se
limitent pas à type, Content-Type et X-Message-Stamp-*. Mettez donc à jour les
consommateurs avant les émetteurs.
Source : Symfony, 29 octobre 2026. Source en anglais.