gpt4 book ai didi

php - 如何将生产者作为服务注入(inject) RabbitMQBundle 消费者?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:35:08 26 4
gpt4 key购买 nike

我必须修改一个用 Symfony 和 RabbitMQ 开发的 php 系统作为一个队列系统。我没有直接使用 RabbitMQ 与 PHP 的绑定(bind),而是使用 Symfony 的 RabbitMQBundle。

我的问题是我不知道如何发布来自消费者的消息。是的,我知道,消费者旨在消费消息,而不是发布消息。但是我有一个多步骤的工作流,我需要在处理完一些以前的消息后发布新消息。

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

在我的 Controller 中很容易调用这些生产者,我只需要输入类似的东西

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

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

我的生产者在 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 }

感谢您的宝贵时间。

最佳答案

您可以在您的消费者中注入(inject) 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);

}

希望对你有帮助

关于php - 如何将生产者作为服务注入(inject) RabbitMQBundle 消费者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31696841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com