Как внедрить производителя в качестве услуги в потребителя RabbitMQBundle?


Мне нужно модифицировать систему php, разработанную с помощью Symfony и RabbitMQ, в качестве системы массового обслуживания. Я напрямую не использую привязки RabbitMQ с PHP, но RabbitMQBundle для Symfony.

Моя проблема в том, что я не знаю, как опубликовать сообщение от потребителя. Да, я знаю, потребитель предназначен для потребления сообщений, а не для публикации сообщений. Но у меня многоэтапный рабочий процесс, и мне нужно публиковать новые сообщения после обработки некоторых предыдущих сообщений.

"Магия" Symfony лишает меня возможности узнать, как все подключено. Я читал об услугах, но, насколько я знаю, "производители" нигде не объявляются как услуги, и в моем конкретном случае я не использую определенные классы для всех, а только привязываю имя к обмену RabbitMQ.

В моих контроллерах легко вызвать этих производителей, мне нужно только ввести что-то вроде

$this->get('old_sound_rabbit_mq.my_own_producer')->publish($whatever);

Но в потребителях я должен явно вводить каждую зависимость, и я не знаю как сделать инъекцию производителю.

Объявление моего производителя в настройках rabbitmqbundle выглядит примерно так:

my_own:
        connection:       default
        exchange_options: {name: 'my-own-channel', type: direct}

Декларация о моем потребительском обслуживании в услугах.файл yml выглядит примерно так:

my_own_service:
    class: MyOwnBundleBundle\Consumers\MyOwnConsumer
    arguments: ["@logger", "@doctrine_mongodb", "%variable1%", "%variable2%"]
    tags:
        - { name: monolog.logger, channel: my_own_channel }

Спасибо, что уделили мне время.

Author: castarco, 2015-07-29

1 answers

Вы можете ввести производителя 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 }

И измените структуру вашего сервиса, чтобы принять новый параметр:

protected $producer;

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

И поэтому используйте его как:

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

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

    }

Надеюсь, это поможет

 4
Author: Matteo, 2015-07-29 09:57:14