send_task仅适用于特定用户

时间:2017-08-13 11:21:27

标签: rabbitmq celery amqp celery-task rabbitmqctl

设置: Celery 4.1,RabbitMQ 3.6.1(作为经纪人),Redis(作为后端,此处不相关)。

有两个兔子用户:

  • admin_user,权限为.* .* .*
  • remote_user,权限为ack ack ack

admin_user可以触发任务,并由芹菜工作者用来处理任务。

remote_user只能触发一种类型的任务 - ack,并在一个专用的ack队列中排队,后来由ack工作人员使用({{1} }})。

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

remote_user

这在Celery 3.1中完美运行。升级到Celery 4.1后,它不再发送任务了。该呼叫返回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花(或通过兔子管理ui)或日志中看不到该消息。

  • 尝试设置AsyncResult 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') 权限。 知道我能做什么吗?

1 个答案:

答案 0 :(得分: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'
    }
}

<强> run_task.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'))