我被困在关于 Symfony 和总线消息的问题上。
现在,我们有 1 个交换器绑定到多个队列,每个队列都链接到一个服务(微服务)
一条消息被发送到一个交换器,它把它提供给每个绑定的队列。主要问题是我找不到一种方法来告诉不需要消息的服务停止尝试通过 PhpSerializer 反序列化消息。
因此,当一个服务收到一条他不应该处理的消息时,他会尝试反序列化它并给出一个
[Symfony\Component\Messenger\Exception\MessageDecodingFailedException]
Message class "App\Entity\User" not found during decoding.
这是“正常的”,这个服务不知道用户实体,永远不会。我希望该服务只是看到他无法处理该消息,然后直接使用它。(因为每个队列有 1 个服务,他需要使用它,否则它将永远留在队列中)。因为现在,它只是抛出这个异常并杀死消费者,这是不好的。
我知道我不应该在不需要它的队列上发送消息,但在微服务中,它坚持每个人都需要获取消息,因为服务在发送之前并不知道彼此。
这是我独特的处理程序(我不认为类本身是相关的,因为它是触发异常的 symfony/messenger 的自动反序列化):
class UserCreatedHandler implements MessageHandlerInterface
{
private WorkspaceHandler $workspaceHandler;
public function __construct(WorkspaceHandler $workspaceHandler)
{
$this->workspaceHandler = $workspaceHandler;
}
public function __invoke(UserCreated $message): void
{
var_dump('message UserCreated trouvé');
var_dump($message);
//TODO gérer la création de workspace depuis un bus de message
//$this->workspaceHandler->createWorkspace($message);
try {
$this->workspaceHandler->createBusWorkspace($message);
var_dump("passé dans le try");
} catch (\Exception $e) {
var_dump($e->getMessage());
}
}
}
服务.yaml
App\MessageHandler\UserCreatedHandler:
#resource: '../src/MessageHandler'
autoconfigure: false
tags: [ { name: messenger.message_handler, handles: App\Entity\Messenger\UserCreated, bus: event.bus } ]
Messenger.yaml
framework:
messenger:
default_bus: event.bus
transports:
messages:
dsn: '%env(MESSENGER_TRANSPORT_DSN)%messages'
options:
exchange:
name: messages
buses:
#messenger.bus.default: ~
event.bus:
default_middleware: allow_no_handlers
routing:
App\Entity\Messenger\UserCreated: [ messages ] #Multi-dispatch
我唯一的线索是 SerializerInterface,我尝试创建一个类来使用 decode() 实现它,但我不明白我应该如何尝试捕获来获取未知类并且只丢弃消息(而不是关闭如果抛出异常。