简体   繁体   English

如何防止消息发送到故障传输?

[英]How to prevent message to be sent to the failure transport?

Is there a possibility to prevent that certain messages (eg those implementing a certain interface) are sent to the failure transport after being rejected (after multiple retries)?是否有可能防止某些消息(例如实现某个接口的消息)在被拒绝后(多次重试后)发送到失败传输?

Here is one way to do that.这是一种方法。

Component that sends failed messages to the failure transport, is registered in the container under the name messenger.failure.send_failed_message_to_failure_transport_listener .向失败传输发送失败消息的组件在名称messenger.failure.send_failed_message_to_failure_transport_listener下注册在容器中。 It's an event listener that handles WorkerMessageFailedEvent s.它是一个处理WorkerMessageFailedEvent的事件监听器。

The idea is to decorate it with a simple wrapper that would check if a failed message implements certain interface (or any other possible condition holds true), then handling should be skipped.这个想法是用一个简单的包装器来装饰它,该包装器将检查失败的消息是否实现了某个接口(或任何其他可能的条件成立),然后应该跳过处理。 Otherwise, the original event listener is called.否则,将调用原始事件侦听器。

# 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);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 发送响应后如何防止其他页面请求 - How to prevent additional page requests after response sent 在 Symfony 4 &amp; Messenger 中向不同的传输或虚拟主机发送消息 - Dispatch message to different transport or vhost in Symfony 4 & Messenger 如果通过Gmail发送,请勿在“已发送邮件”中保存邮件 - Don't save a message in “sent mail” if sent via Gmail 使用Messenger读取未使用Messenger发送的排队邮件 - Use Messenger to read queued message not sent with Messenger 修改RabbitMQ在消费者中发送的消息 - Modify message sent by rabbitMQ inside consumer “oro_message_queue.transport”下的 nrecognized 选项“amqp”。 可用选项是“dbal” - nrecognized option "amqp" under "oro_message_queue.transport". Available option is "dbal" 防止Twig注入错误消息 - Prevent Twig from injecting error message 为什么“assertSelectorExists()”断言不显示我指定的失败消息? - Why doesn't the "assertSelectorExists()" assertion show the failure message that I specify? 使用swiftmailer和Google帐户发送的邮件是否会在使用swiftmailer的邮件中显示在任何地方? - Does message sent with swiftmailer and google account show anywhere in message that swiftmailer was used? 如何防止字段带有链接 - How to prevent a field to be with a link
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM