我已经安装了RabbitMQ Bundle.现在这就是我想要做的事情:
控制器:创建Redis-List,将消息推送到客户端,然后将消息发送到队列,这样可以异步执行较重的后台任务.
但我迷路了.
$msg = array('userid' => $someid);
$this->get('old_sound_rabbit_mq.task_example_producer')->publish(serialize($msg));
Run Code Online (Sandbox Code Playgroud)
这会将一些数据发送给产品吗?相应的消费者将执行繁重的后台任务(数据库查询等,基于生产者的"用户ID")?我需要回电吗?什么是队列?!队列将消息从生产者逐个转发给消费者?那么我可以让多个消费者同时处理更多消息吗?!
有点老帖,但万一其他人来寻求帮助:
看来你正在使用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
Run Code Online (Sandbox Code Playgroud)
这里定义了连接,一个生产者和一个消费者.两者都使用相同的"默认"连接.您还需要将回调定义为服务:
# My services
services:
test_class:
class: AppBundle\Testclasses\rabbittest\testclass
arguments: [@logger]
Run Code Online (Sandbox Code Playgroud)
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.
}
}
Run Code Online (Sandbox Code Playgroud)
3:现在你已经拥有的制作人:
$msg = array('userid' => $someid);
$this->get('old_sound_rabbit_mq.task_example_producer')->publish(serialize($msg));
Run Code Online (Sandbox Code Playgroud)
4:最后一块拼图正在运行消费者.消费者从控制台启动,我在Windows机器上开发,并使用Windows PowerShell.您可以像这样启动消费者:
php app/console rabbitmq:consumer task_example
Run Code Online (Sandbox Code Playgroud)
它应该给你文字:
testclass正在听......
,如果你从这个例子中复制了它.该文本没有必要,没有它,控制台将输出任何内容,但会正常工作.除非出现一些错误.
但请记住,您必须位于symfony-application所在的目录中.例如:
C:\ WAMP\WWW\symfony的\ MY_PROJECT
队列是您要处理的邮件列表.
交换是队列消息的路由器.(例如,您可以将多个队列列入同一个交换机).
制作人将消息推送到交易所.
消费者从队列中读取消息.
通常,您有一个生产者和许多消费者并行处理消息.
您发布的代码演示了生产者发布到交易所.
| 归档时间: |
|
| 查看次数: |
5201 次 |
| 最近记录: |