Как разместить задачу в очереди 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.

вы также можете ссылаться на это сельдерей страницы