2017-08-13 7 views
1

configuration: Céleri 4.1, RabbitMQ 3.6.1 (En tant que courtier), Redis (Comme backend, pas pertinent ici).send_task fonctionne uniquement avec un utilisateur spécifique

deux utilisateurs de lapin ayant:

  • admin_user avec des autorisations de .* .* .*.
  • remote_user avec les permissions de ack ack ack.

admin_user peut déclencher des tâches et est utilisé par les employés de céleri pour gérer les tâches.

remote_user ne peut déclencher un type de tâche - ack et est dans une file d'attente en file d'attente ack dédiée qui plus tard consommée par ack travailleur (par admin_user).

Le remote_user envoie la tâche par le code suivant:

from celery import Celery 

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

Cela fonctionne parfaitement dans Céleri 3.1. Après la mise à niveau vers Celery 4.1, il n'envoie plus la tâche. L'appel renvoie un AsyncResult mais je ne vois pas le message dans Fleur de céleri (ou via l'interface de gestion de lapin) ou dans les journaux.

  • Essayer de définir des autorisations à remote_user.* .* .* comme dans le admin_user - ne contribue pas.
  • Essayer d'ajouter administrator tag - n'aide pas.

Changer l'utilisateur du courtier à 'amqp://admin_user:[email protected]<machine_ip>:5672/vhost' fonctionne le:

from celery import Celery 

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

Mais je ne veux pas donner une machine à distance les autorisations admin_user. Une idée de ce que je peux faire?

Répondre

0

Solved API changé je suppose, mais de rester avec les autorisations actuelles de RabbitMQ je devais utiliser l'itinéraire suivant:

old_celery_config.py: (céleri 3,1)

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

celery_config.py: (céleri 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:[email protected]<machine_ip>:5672/vhost') 
app.config_from_object('celery_config') 
app.send_task('ack_task', args=('a1', 'a2'))