Symfony SyncTransport发送两次

9jyewag0  于 2023-11-22  发布在  其他
关注(0)|答案(1)|浏览(162)

我不知道这是一个错误或功能或概念,我不明白的时刻,所以请启发我。

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


所描述的行为不会发生,没有双重标记,总线上没有第二次分派,只有处理程序将被执行。
所以问题是,这是想要的,我错过了一个概念,或者这可能是一个错误?

x8goxv8g

x8goxv8g1#

我不知道为什么symfony的开发者会这样做同步传输,但是删除同步传输的路由会修复这个奇怪的行为。
此外,如果您有到任何TCP/IP传输的路由,并且希望使用TransportNamesStamp同步处理命令,则不能只使用

Envelope::wrap($envelope, [new TransportNamesStamp(['sync])]);

字符串
因为你将面临与你描述的相同的问题。相反,你可以这样处理它:

Envelope::wrap($envelope, [new TransportNamesStamp([])]);


SendMessageMiddleware将只执行下一个处理程序,而不是通过消息总线执行整个新命令。

相关问题