我已经使用 Symfony 6.4 和 Messenger 配置了我的项目。我在事件总线上创建了 2 个传输(同步和异步)。当我发送消息时,该消息会通过 2 个传输进行传输,这就是我想要的。在处理程序上,我添加了 fromTransport 属性来定义处理程序运行的时间。通常,消息必须仅在传输同步时处理,但它也以异步方式运行......
如果我的配置出错或者这是一个错误,我不会,我已经打开了一个问题 https://github.com/symfony/symfony/issues/54543
messenger.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://'
服务.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());
}
}
在服务配置中,您可以手动标记消息处理程序。
当您启用了自动配置(您没有)并在处理程序中使用 AsMessageHandler 属性时,这是不必要的。
禁用自动配置(如在服务配置中)属性不起作用,因此仅使用您在服务配置中指定的标签来配置消息处理程序。换句话说,您的处理程序未配置
fromTransport
选项。
我会删除服务配置中的标签,启用自动配置并重试:
App\MessageHandler\Event\:
resource: '../src/MessageHandler/Event'
autoconfigure: true