我必须将使用Symfony和RabbitMQ开发的php系统修改为排队系统。我不是直接使用PHP的RabbitMQ绑定,而是使用RabbitMQBundle for 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}
在services.yml文件中声明我的消费者服务是这样的:
my_own_service:
class: MyOwnBundleBundle\Consumers\MyOwnConsumer
arguments: ["@logger", "@doctrine_mongodb", "%variable1%", "%variable2%"]
tags:
- { name: monolog.logger, channel: my_own_channel }
感谢您的时间。
答案 0 :(得分:4)
您可以在您的消费者中注入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);
}
希望这个帮助