我有一个用例,其中我的Django应用程序需要处理来自外部源的消息。 Celery通过Custom Message Consumers支持此功能,此部分工作正常。
交换类型为headers
,因此消息可以根据条件路由到不同的队列。条件是通过Django Admin配置的。从下面的代码中,您可以看到,例如,QueueItem可以随时激活/关闭。
此功能可在首次加载工作程序时找到。在新的Rabbit上,所有交换,队列和路由都已建立,并且自定义使用者可以正确使用消息。
问题出在用户添加新的QueueItem或翻转现有QueueItem的活动状态时。我可以动态创建新队列,但是无论我如何努力尝试,Custom Consumer都不会从中消耗资源。我希望该应用程序执行以下操作:
app.control.broadcast('pool_restart')
)app.control.add_consumer(...)
)class MyConsumerStep(bootsteps.ConsumerStep):
alias = 'MyConsumerStep'
def get_queues(self):
from app.models import QueueItem
qs = QueueItem.objects.filter(active=True, mode=QueueItem.MODE_ASYNC, direction=QueueItem.DIRECTION_INBOUND)
return [Queue(q.name, Exchange('qbpubsub', 'headers'),
binding_arguments={
'var1': q.field1,
'var2': q.field2,
'x-match': 'any'
}) for q in qs]
def get_consumers(self, channel):
return [Consumer(channel,
queues=self.service_queues,
on_message=self.on_message,
accept=['json'])]
def on_message(self, message):
payload = message.decode()
print('Received message: {0!r} {props!r} rawlen={s}'.format(
payload, props=message.properties, s=len(message.body)
))
message.ack()
我已经成功创建了一个新队列。我已经成功地将其附加到默认的芹菜消费者。我想以某种方式将其附加到自定义使用者,以便on_message
回调可以对其进行处理。
我觉得我已经很接近了,但是只是缺少了Celery / Kombu API的一小部分。