在symfony 8.2测试环境中,可用chainstamp::envelope声明连续消息,再附加dispatchonfailurestamp指定永久失败后的补偿任务。先准备各步骤消息、处理器及路由;8.2仍在开发阶段并要求php 8.4以上,不应直接把示例当作旧稳定分支已支持的接口。
先声明顺序,再处理每一步
业务消息和处理器仍由项目定义。下面沿用官方示例中的订单消息名,分别表示扣款、发货和取消;实际项目需实现这些类及其处理器。
use Symfony\Component\Messenger\Stamp\ChainStamp;
use Symfony\Component\Messenger\Stamp\DispatchOnFailureStamp;
$bus->dispatch(
ChainStamp::envelope(new ChargeCard($orderId), new ShipOrder($orderId))
->with(new DispatchOnFailureStamp(new CancelOrder($orderId)))
);

Symfony 8.2官方示例文档截图。
确认路由和失败边界
每条消息在前一步所有处理器完成后才派发。步骤没有自己的路由时,使用上一步收到消息的传输;各步骤独立重试,失败会停止后续链。
补偿消息在工作进程耗尽重试,或同步派发抛出异常后触发。该戳沿链传递,因此只派发一次补偿;它不能代替外部支付系统的事务设计。

Symfony 8.2官方示例文档截图。
让补偿处理器知道哪里失败
取消处理器可在消息参数后接收FailedMessageStamp及ErrorDetailsStamp,再读取实际失败消息和异常信息。补偿派发失败时才回到失败转运。
先用可回滚的测试订单验证扣款、发货失败和补偿失败三条路径,再接入真实外部服务。重试仍可能重新执行业务动作,处理器需要按自身业务保持幂等。











