如何从Messenger组件的自定义中间件访问总线传输?

时间:2019-05-25 11:51:30

标签: symfony symfony4 symfony-messenger

custom middlewares定义Symfony Messenger时,有时访问传输以处理消息和队列很有用。

例如,使用不同的参数重新排队消息,或者仅在处理成功后才删除消息,等等。

尝试了对TransportInterface的类型提示:

class CustomMiddleware implements MiddlewareInterface {

    /**
     * @var \Symfony\Component\Messenger\Transport\TransportInterface
     */
    private $transport;

    public function __construct( TransportInterface $transport ) {
        $this->transport = $transport;
    }

    public function handle( Envelope $envelope, StackInterface $stack ): Envelope {
        // TODO: Implement handle() method.
        return $envelope;
    }

}

但是Symfony抱怨它不能自动连接服务:

  

无法自动装配服务“ App \ Messenger \ CustomMiddleware”:方法“ __construct()”的参数“ $ transport”引用接口“ Symfony \ Component \ Messenger \ Transport \ TransportInterface”,但不存在此类服务。您可能应该将此接口别名为以下现有服务之一:“ App \ Messenger \ SqsTransport”,“ messenger.transport.customsqs”。

SqsTransport是指为此应用程序构建的自定义传输。 messenger.transport.customsqs指的是其工厂定义的定义位置:

framework:
  messenger:
    transports:
      customsqs: '%env(MESSENGER_TRANSPORT_DSN)%'

在这里有些困难,我认为这不是一个完全不寻常的用例,应该或多或少地直接找到我不知所措的解决方案。

由于SqsTransport是由解释DSN的自定义TransportFactory构建的,因此不能真正为其别名。

尝试显式定义CustomMiddleware服务以引用@messenger.transport.customsqs,但得到的结果完全相同:

services:
  App\Messenger\CustomMiddleware:
    arguments: ['@messenger.transport.customsqs']

0 个答案:

没有答案