设置: 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')
权限。
知道我能做什么吗?
答案 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'))