Sellery dynamische Queue-Erstellung und Routing

8

Ich versuche, eine Aufgabe aufzurufen und eine Warteschlange für diese Aufgabe zu erstellen, wenn sie nicht existiert, und dann die aufgerufene Aufgabe sofort in diese Warteschlange einzufügen. Ich habe den folgenden Code:

%Vor%

Dann habe ich einen benutzerdefinierten Router:

%Vor%

Dies erzeugt einen Austausch namens greet.1 und eine Warteschlange namens greet.1 , aber die Warteschlange ist leer. Der Austausch sollte nur greet genannt werden, der weiß, wie man einen Routing-Schlüssel wie greet.1 an die Warteschlange namens greet.1 weiterleitet.

Irgendwelche Ideen?

    
Marconi 09.08.2012, 11:52
quelle

1 Antwort

13

Wenn Sie Folgendes tun:

%Vor%

Dann nimmt Sellerie Standardwerte aus der Warteschlange "foo" in CELERY_QUEUES, oder wenn es nicht existiert, dann erzeuge es automatisch mit (queue = foo, exchange = foo, routing_key = foo)

Wenn also 'foo' in CELERY_QUEUES nicht existiert, erhalten Sie:

%Vor%

Der Produzent wird dann diese Queue deklarieren, aber da Sie den routing_key außer Kraft setzen, Senden Sie die Nachricht tatsächlich mit routing_key = 'foobar'

Das mag seltsam erscheinen, aber das Verhalten ist tatsächlich nützlich für den Austausch von Themen, wo Sie zu verschiedenen Themen veröffentlichen.

Es ist schwieriger zu tun, was Sie wollen, aber Sie können die Warteschlange selbst erstellen und deklarieren Sie es, aber das wird mit automatischen Nachrichtenveröffentlichungswiederholungen nicht gut funktionieren. Es wäre besser, wenn das Warteschlangenargument für apply_async unterstützt stattdessen eine benutzerdefinierte kombu.Queue , die sowohl deklariert als auch als Ziel verwendet wird. Vielleicht könntest du dafür ein Problem bei Ссылка

öffnen     
asksol 16.08.2012 17:08
quelle

Tags und Links