如何将生产者即服务注入RabbitMQBundle消费者?

cas*_*rco 5 php rabbitmq symfony

我必须修改使用Symfony和RabbitMQ作为排队系统开发的php系统。我不是直接在PHP中使用RabbitMQ绑定,而是在Symfony中使用RabbitMQBundle。

我的问题是我不知道如何发布来自消费者的消息。是的,我知道,使用者被设计为使用消息,而不是发布消息。但是我有一个多步骤工作流,在处理了一些先前的消息之后,我需要发布新消息。

Symfony的“魔力”使我无法发现所有事物的连接方式。我一直在阅读有关服务的信息,但据我所知,“生产者”并未在任何地方声明为服务,在我的情况下,我没有为每个人使用特定的类,而只是将名称绑定到RabbitMq交换。

在我的控制器中,可以很容易地调用这些生产者,我只需要键入类似

$this->get('old_sound_rabbit_mq.my_own_producer')->publish($whatever);
Run Code Online (Sandbox Code Playgroud)

但是在消费者中,我必须显式注入每个依赖项,而且我也不知道如何注入生产者。

我的生产者在rabbitmqbundle设置中的声明是这样的:

my_own:
        connection:       default
        exchange_options: {name: 'my-own-channel', type: direct}
Run Code Online (Sandbox Code Playgroud)

在services.yml文件中我的消费者服务的声明类似于:

my_own_service:
    class: MyOwnBundleBundle\Consumers\MyOwnConsumer
    arguments: ["@logger", "@doctrine_mongodb", "%variable1%", "%variable2%"]
    tags:
        - { name: monolog.logger, channel: my_own_channel }
Run Code Online (Sandbox Code Playgroud)

感谢您的时间。

Mat*_*teo 5

您可以在用户中注入rabbitmq生产者,并照常使用它。例如,您可以按以下方式更改使用者服务配置(请参阅最后一个参数):

my_own_service:
    class: MyOwnBundleBundle\Consumers\MyOwnConsumer
    arguments: ["@logger", "@doctrine_mongodb", "%variable1%", "%variable2%", "@old_sound_rabbit_mq.another_producer"]
    tags:
        - { name: monolog.logger, channel: my_own_channel }
Run Code Online (Sandbox Code Playgroud)

并更改服务的构造函数以接受新参数:

protected $producer;

public function __construct($logger, $doctrine, $var1,$var2, $producer)
{
    ...
    $this->producer=$producer;
}
Run Code Online (Sandbox Code Playgroud)

因此将其用作:

public function execute(AMQPMessage $msg)
    {
       ....
       $mesassage = ....

      $this->producer-> publish($message);

    }
Run Code Online (Sandbox Code Playgroud)

希望有帮助