1

设置: Celery 4.1、RabbitMQ 3.6.1(作为代理)、Redis(作为后端,此处不相关)。

有两个兔子用户:

  • admin_user具有.* .* .*.
  • remote_user具有ack ack ack.

admin_user可以触发任务,被芹菜工人用来处理任务。

remote_user只能触发一种类型的任务 -ack并被排入专用ack队列,稍后由ack工作人员(由admin_user)消耗。

通过以下remote_user代码发送任务:

from celery import Celery

app = Celery('remote', broker='amqp://remote_user:remote_pass@<machine_ip>:5672/vhost')
app.send_task('ack', args=('a1', 'a2'), queue='ack', route_name='ack')

这在 Celery 3.1 中完美运行。升级到 Celery 4.1 后,它不再发送任务。该调用返回一个AsyncResult但我在 Celery 花(或通过兔子管理 ui)或日志中看不到该消息。

  • 尝试将权限设置remote_user .* .* .*admin_user- 无济于事。
  • 尝试添加administrator标签 - 没有帮助。

将经纪人的用户更改为 'amqp://admin_user:admin_pass@<machine_ip>:5672/vhost'确实有效:

from celery import Celery

app = Celery('remote', broker='amqp://admin_user:admin_pass@<machine_ip>:5672/vhost')
app.send_task('ack', args=('a1', 'a2'), queue='ack', route_name='ack')

但我不想给远程机器admin_user权限。知道我能做什么吗?

4

1 回答 1

0

解决了,我猜 API 改变了,但为了保持 RabbitMQ 的当前权限,我不得不使用以下路线:

old_celery_config.py : (芹菜 3.1)

CELERY_ROUTES = {
    'ack_task': {
        'queue': 'geo_ack'
    }
}

celery_config.py:(芹菜 4.1)

CELERY_ROUTES = {
    'ack_task': {
        'exchange': 'ack',
        'exchange_type': 'direct',
        'routing_key': 'ack'
    }
}

运行任务.py:

from celery import Celery

app = Celery('remote', broker='amqp://remote_user:remote_pass@<machine_ip>:5672/vhost')
app.config_from_object('celery_config')
app.send_task('ack_task', args=('a1', 'a2'))
于 2017-08-17T04:59:12.217 回答