Как разместить задачу в очереди celery-rabbitmq в PHP?
у меня ниже установлены версии сельдерея и rabbitmq -
сельдерей 3.1.6
в RabbitMQ 3.1.1
Я могу отправить задачу в очередь по умолчанию из PHP -
//client.php
<?php
require 'celery-php/celery.php';
$c = new Celery('localhost', 'guest', 'guest', '/');
$result = $c->PostTask('tasks.add', array(2,2));
мой рабочий модуль находится в python -
# tasks.py
from celery import Celery
celery = Celery('tasks', broker='amqp://guest:guest@localhost:5672//')
@celery.task(queue='demo', name='add')
def add(x, y):
return x + y
я запускаю работника сельдерея и клиента Вот так -
# terminal window 1
$ celery -A tasks worker --loglevel=info
# terminal window 2
$ php -f client.php
это работает. Я вижу ниже вывод в окне терминала 1:
Received task: tasks.add[php_52b1759141a8b3.43107845]
Task tasks.add[php_52b1759141a8b3.43107845] succeeded in 0.000701383920386s: 4
но я хочу иметь разные очереди. Для демонстрация, допустим, я хочу, чтобы только одна очередь называлась демо. Поэтому я управляю своим сельдерейным работником вот так -
$ celery -A tasks worker --loglevel=info -Q demo
но это не работает. Задача не выполняется. Я думаю, это, вероятно, потому, что PHP-код публикует задачу в очереди по умолчанию:сельдерей (по-видимому, не на демо очередь).
как разместить мою задачу в определенной очереди в PHP? Пожалуйста помочь.
1 ответов
по умолчанию ваш PHP-клиент для сельдерея принимает имя очереди как "сельдерей".
чтобы изменить очередь для публикации, необходимо указать имя очереди при создании экземпляра соединения с сельдереем. Итак, если вы начинаете свой сельдерей с опции" - Q demo", то ваше соединение с сельдереем в PHP должно быть -
$exchange = 'demo';
$binding = 'demo';
$c = new Celery('localhost', 'guest', 'guest', '/', $exchange, $binding);
Примечание: с параметром-Q значение exchange и routing_key совпадает с queue_name.
пожалуйста, попробуйте это и поделиться результаты.
об обмене и привязке :
по аналогии с телефонными службами, Exchange подобен "телефонному оператору", чья единственная задача - "направить вызов вам" с помощью routing_key.
привязка-это "ваш номер телефона", который действует как routing_key на ваш телефон.
Примечание: этот процесс, в котором exchange перенаправляет входящее сообщение в очередь на основе привязки (routing_key), является прямым типом обмена. AMQP имеет несколько других типов обменов, которые вы можете прочитать в документации AMQP.
вы также можете ссылаться на это сельдерей страницы