Symfony2,RabbitMQ:我迷路了

时间:2015-05-28 13:02:56

标签: symfony rabbitmq

我已经安装了RabbitMQ Bundle。现在这就是我想要做的事情:

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

但我输了。

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

这会将一些数据发送给产品吗?相应的消费者将执行繁重的后台任务(数据库查询等,基于" userid"来自生产者)?我需要回电吗?队列是什么?!队列将消息从生产者逐个转发给消费者?那么我可以让多个消费者同时处理更多消息吗?!

3 个答案:

答案 0 :(得分:8)

有点老帖,但万一其他人来寻求帮助:

好像你正在使用old_sound的rabbitmq包。它在这里有一些有用的教程类型的文档:https://github.com/videlalvaro/RabbitMqBundle

它帮助我在symfony中使用rabbitmq。

简而言之:

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

# 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_class”。简单的消费者可能看起来像这样:

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.
   }
}

3:现在是你已经拥有的制作人:

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

4:最后一块拼图正在运行消费者。消费者从控制台启动,我在Windows机器上开发,并使用Windows PowerShell。您可以像这样启动消费者:

php app/console rabbitmq:consumer task_example

它应该给你文字:

  

testclass正在听......

,如果你从这个例子中复制了它。该文本没有必要,没有它,控制台将输出任何内容,但会正常工作。除非出现一些错误。

但请记住,您必须位于symfony-application所在的目录中。例如:

  

C:\瓦帕\ WWW \ symfony的\ MY_PROJECT

答案 1 :(得分:6)

队列是您要处理的邮件列表。

交换是队列消息的路由器。 (例如,您可以将多个队列列入同一个交换中。)

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

消费者从队列中读取消息。

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

您发布的代码演示了制作人发布到交易所。

答案 2 :(得分:0)

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

a solution隐藏所有这些细节,留下一个简单但功能强大的界面供您使用。该文档是short。如果您遵循它,您将获得工作解决方案,而不了解RabbitMQ实际上是如何工作的。

P.S。这是how to migrate from RabbitMQBundle to EnqueueBundle上的博文。