代码之家  ›  专栏  ›  技术社区  ›  eldiablo62

Symfony 6.4 Messenger问题,#[AsMessageHandler(fromTransport:“sync”)]

  •  0
  • eldiablo62  · 技术社区  · 1 年前

    我已经用Symfony 6.4和Messenger配置了我的项目。我在事件总线上创建了两个传输(同步和异步)。当我发送一条消息时,这条消息会在2个传输上发送,这就是我想要的。在处理程序上,我添加了fromTransport属性来定义处理程序何时运行。通常情况下,消息必须仅在传输同步时处理,但它也在异步上运行。。。

    我不知道,如果我的配置出错了,或者是一个bug,我就打开了一个问题 https://github.com/symfony/symfony/issues/54543

    信使.yaml

    messenger:
        reset_on_message: true
        buses:
            bus.event:
                default_middleware:
                    enabled: true
                    allow_no_handlers: true
        failure_transport: failed
    
        transports:
            async:
                dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
                options:
                    queue_name: async
                retry_strategy:
                    max_retries: 3
                    delay: 60000
                    multiplier: 2
                    max_delay: 0
                serializer: messenger.transport.symfony_serializer
    
            failed: 'doctrine://default?queue_name=failed'
    
            sync: 'sync://'
    
        routing:
            App\Message\Event\MessageEventInterface: [async, sync]
    when@test:
        framework:
            messenger:
                transports:
                    async: 'in-memory://'
    

    services.yaml

        App\MessageHandler\Event\:
        resource: '../src/MessageHandler/Event'
        autoconfigure: false
        tags: [ { name: messenger.message_handler, bus: bus.event } ]
    

    我的管理员

        <?php
    
    declare(strict_types=1);
    
    namespace App\MessageHandler\Event\Test;
    
    use App\Message\Event\Agent\AgentTestedEvent;
    use Psr\Log\LoggerInterface;
    use Symfony\Component\Messenger\Attribute\AsMessageHandler;
    
    #[AsMessageHandler(bus: 'bus.event', fromTransport: 'sync')]
    class TestAgentTested extends TestAgentMessageHandlerAbstract
    {
    
        public function __construct(private readonly LoggerInterface $logger)
        {
        }
    
        public function __invoke(AgentTestedEvent $testedEvent): void
        {
    
            $this->logger->error('test lance ' . $testedEvent->getAgentUuid());
        }
    }
    
    0 回复  |  直到 1 年前
        1
  •  1
  •   Yarimadam    1 年前

    在服务配置中,您可以手动标记消息处理程序。

    当您启用了自动配置(您没有启用)并且在处理程序中使用AsMessageHandler属性时,这是不必要的。

    在禁用自动配置的情况下(如在服务配置中),属性没有效果,因此只有在服务配置中将指定的标记用于配置消息处理程序。换句话说,您的处理程序没有配置 fromTransport 选项

    我将删除服务配置中的标记,启用自动配置,然后重试:

    App\MessageHandler\Event\:
    resource: '../src/MessageHandler/Event'
    autoconfigure: true