Symfony2,RabbitMQ:I';我迷路了

Symfony2,RabbitMQ:I';我迷路了,symfony,rabbitmq,Symfony,Rabbitmq,我已经安装了RabbitMQ包。现在我想做的是: 控制器:创建Redis列表,将消息推送到客户端,然后将消息发送到队列中,这样可以异步执行较重的后台任务 但是我迷路了 $msg = array('userid' => $someid); $this->get('old_sound_rabbit_mq.task_example_producer')->publish(serialize($msg)); 这会将一些数据发送到产品?相应的使用者将执行繁重的后台任务(DB查询等,基于

我已经安装了RabbitMQ包。现在我想做的是:

控制器:创建Redis列表,将消息推送到客户端,然后将消息发送到队列中,这样可以异步执行较重的后台任务

但是我迷路了

$msg = array('userid' => $someid);
$this->get('old_sound_rabbit_mq.task_example_producer')->publish(serialize($msg));

这会将一些数据发送到产品?相应的使用者将执行繁重的后台任务(DB查询等,基于生产者的“用户ID”)?我需要回电话吗?排队的是什么?!队列将消息从生产者一个接一个地转发给消费者?那么我可以让多个消费者同时处理更多的消息吗

队列是要处理的消息列表

交换是将消息发送到队列的路由器。(例如,您可以将多个队列列出到同一个exchange)

制作人将消息推送到交易所

消费者从队列中读取消息

通常,您有一个生产者和多个消费者来并行处理消息


您发布的代码演示了制作人发布到exchange。

有点旧,但万一有人来寻求帮助:

您似乎正在使用旧_sound的rabbitmq包。这里有一些有用的教程类型的文档:

它帮助我在symfony与rabbitmq合作

简言之:

1:您需要在config.yml-file中进行一些配置。例如:

# RabbitMQ Configuration
old_sound_rabbit_mq:
    connections:
        default:
            host:        'localhost'
            port:        5672
            user:        'guest'
            password:    'guest'
            vhost:       '/'
            lazy:        true
            connection_timeout: 3
            read_write_timeout: 3

            # requires php-amqplib v2.4.1+ and PHP5.4+
            keepalive: false

            # requires php-amqplib v2.4.1+
            heartbeat: 0

    producers:
        task_example:
            connection:       default
            exchange_options: {name: 'task_example', type: direct}
    consumers:
        task_example:
            connection:       default
            exchange_options: {name: 'task_example', type: direct}
            queue_options:    {name: 'task_example'}
            callback:         test_class
这里定义了连接,一个生产者和一个消费者。两者都使用相同的“默认”连接。 您还需要将回调定义为服务:

# My services
services:
   test_class:
      class:      AppBundle\Testclasses\rabbittest\testclass
      arguments:  [@logger]
2:现在您需要消费者,这是这里的回调选项,“test_类”。简单消费者可能是这样的:

namespace AppBundle\Testclasses\rabbittest;

use OldSound\RabbitMqBundle\RabbitMq\ConsumerInterface;
use PhpAmqpLib\Message\AMQPMessage;

class testclass implements ConsumerInterface
{
   private $logger; // Monolog-logger.

   // Init:
   public function __construct( $logger )
   {
      $this->logger = $logger;
      echo "testclass is listening...";
   }

   public function execute(AMQPMessage $msg)
   {
      $message = unserialize($msg->body);
      $userid = $message['userid'];
      // Do something with the data. Save to db, write a log, whatever.
   }
}
php app/console rabbitmq:consumer task_example
3:现在你已经有了制片人:

$msg = array('userid' => $someid);
$this->get('old_sound_rabbit_mq.task_example_producer')->publish(serialize($msg));
4:谜题的最后一块是运行消费者。消费者是从控制台开始的,我是在windows机器上开发的,使用的是windows PowerShell。您可以这样启动消费者:

namespace AppBundle\Testclasses\rabbittest;

use OldSound\RabbitMqBundle\RabbitMq\ConsumerInterface;
use PhpAmqpLib\Message\AMQPMessage;

class testclass implements ConsumerInterface
{
   private $logger; // Monolog-logger.

   // Init:
   public function __construct( $logger )
   {
      $this->logger = $logger;
      echo "testclass is listening...";
   }

   public function execute(AMQPMessage $msg)
   {
      $message = unserialize($msg->body);
      $userid = $message['userid'];
      // Do something with the data. Save to db, write a log, whatever.
   }
}
php app/console rabbitmq:consumer task_example
它应该给你文本:

testclass正在侦听

,如果您从这个示例中复制了它。该文本不是必需的,没有它,控制台将不会输出任何内容,但可以正常工作。除非出现错误

但是请记住,您必须位于symfony应用程序所在的目录中。例如:

# RabbitMQ Configuration
old_sound_rabbit_mq:
    connections:
        default:
            host:        'localhost'
            port:        5672
            user:        'guest'
            password:    'guest'
            vhost:       '/'
            lazy:        true
            connection_timeout: 3
            read_write_timeout: 3

            # requires php-amqplib v2.4.1+ and PHP5.4+
            keepalive: false

            # requires php-amqplib v2.4.1+
            heartbeat: 0

    producers:
        task_example:
            connection:       default
            exchange_options: {name: 'task_example', type: direct}
    consumers:
        task_example:
            connection:       default
            exchange_options: {name: 'task_example', type: direct}
            queue_options:    {name: 'task_example'}
            callback:         test_class
C:\wamp\www\symfony\my\u项目


RabbitMQBundle希望您对代理内部有深入的了解。这并不总是你想要的

它隐藏了所有的细节,留下了一个简单但功能强大的界面供您使用。医生是。如果您遵循它,您将得到一个工作解决方案,而不知道RabbitMQ实际上是如何工作的


另外,这里是上的博客帖子。

在集成RabbitMQ(和AMQP)之前,您应该让自己习惯于RabbitMQ(和AMQP)。他们的php教程非常好,可以帮助您了解什么是队列、如何订阅队列、“异步”的含义等。对于那些需要Symfony和OldSound RabbitMQ bundle完整示例用法的人来说,生产者文件是什么样的?似乎找不到一个好的例子that@Notflip:见第3点。生产者文件可以看起来像任何东西,它只需要这两行就可以生成查询。制作人不需要任何其他东西,除非你是在自己的服务(类)。然后需要将rabbitmq.producer注入其中。