我不知道这是一个错误或功能或概念,我不明白的时刻,所以请启发我。
public function send(Envelope $envelope): Envelope
{
/** @var SentStamp|null $sentStamp */
$sentStamp = $envelope->last(SentStamp::class);
$alias = null === $sentStamp ? 'sync' : ($sentStamp->getSenderAlias() ?: $sentStamp->getSenderClass());
$envelope = $envelope->with(new ReceivedStamp($alias));
return $this->messageBus->dispatch($envelope);
}
字符串
上面是Symfony的Messenger组件的SyncTransport类的send方法。
framework:
messenger:
transports:
sync: "sync://"
routing:
App\TestMessage: sync
型
现在,在处理程序采取行动之前,同步传输将再次将消息发送到同一总线,中间件再次执行(在我的情况下,再次添加相同的戳(这是我发现有些不对劲的地方))。
如果我把线拿掉
App\TestMessage: sync
型
所描述的行为不会发生,没有双重标记,总线上没有第二次分派,只有处理程序将被执行。
所以问题是,这是想要的,我错过了一个概念,或者这可能是一个错误?
1条答案
按热度按时间x8goxv8g1#
我不知道为什么symfony的开发者会这样做同步传输,但是删除同步传输的路由会修复这个奇怪的行为。
此外,如果您有到任何TCP/IP传输的路由,并且希望使用
TransportNamesStamp
同步处理命令,则不能只使用字符串
因为你将面临与你描述的相同的问题。相反,你可以这样处理它:
型
SendMessageMiddleware
将只执行下一个处理程序,而不是通过消息总线执行整个新命令。