Как внедрить производителя в качестве услуги в потребителя 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 }
Спасибо, что уделили мне время.
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);
}
Надеюсь, это поможет