2

是否有可能防止某些消息(例如实现某个接口的消息)在被拒绝后(多次重试后)发送到失败传输?

4

1 回答 1

1

这是一种方法。

向失败传输发送失败消息的组件在容器中注册,名称为messenger.failure.send_failed_message_to_failure_transport_listenerWorkerMessageFailedEvent它是一个处理s的事件监听器。

这个想法是用一个简单的包装器来装饰它,该包装器将检查失败的消息是否实现了某个接口(或任何其他可能的条件成立),然后应该跳过处理。否则,将调用原始事件侦听器。

# config/services.yaml
services:
    # ...
    App\EventListener\SendFailedMessageToFailureTransportListenerDecorator:
        decorates: messenger.failure.send_failed_message_to_failure_transport_listener
<?php

namespace App\EventListener;

use App\Events\SomeEventInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
use Symfony\Component\Messenger\EventListener\SendFailedMessageToFailureTransportListener;

class SendFailedMessageToFailureTransportListenerDecorator implements EventSubscriberInterface
{
    private SendFailedMessageToFailureTransportListener $decoratedListener;

    public function __construct(SendFailedMessageToFailureTransportListener $decoratedListener)
    {
        $this->decoratedListener = $decoratedListener;
    }

    public static function getSubscribedEvents()
    {
        return SendFailedMessageToFailureTransportListener::getSubscribedEvents();
    }

    public function onMessageFailed(WorkerMessageFailedEvent $event)
    {
        if (!$event->getEnvelope()->getMessage() instanceof SomeEventInterface) {
            $this->decoratedListener->onMessageFailed($event);
        }
    }
}

于 2021-10-16T17:01:33.433 回答