Python 如何在运行时向自定义消息使用者添加队列

Python 如何在运行时向自定义消息使用者添加队列,python,django,python-3.x,celery,django-celery,Python,Django,Python 3.x,Celery,Django Celery,我有一个用例,我的Django应用程序需要处理来自外部源的消息。芹菜支持这一点,这一部分工作良好 交换类型为headers,因此消息可以根据条件路由到不同的队列。这些条件是通过Django管理员配置的。从下面的代码中,您可以看到,例如,QueueItem可以随时被激活/停用 这项工作可以在首次加载工作人员时找到。在一只新鲜的兔子上,交换、队列和路由都得到了构建,自定义消费者正确地使用消息 问题在于用户添加新的QueueItem或翻转现有QueueItem的活动状态。我可以动态地创建新队列,但无论

我有一个用例,我的Django应用程序需要处理来自外部源的消息。芹菜支持这一点,这一部分工作良好

交换类型为
headers
,因此消息可以根据条件路由到不同的队列。这些条件是通过Django管理员配置的。从下面的代码中,您可以看到,例如,QueueItem可以随时被激活/停用

这项工作可以在首次加载工作人员时找到。在一只新鲜的兔子上,交换、队列和路由都得到了构建,自定义消费者正确地使用消息

问题在于用户添加新的QueueItem或翻转现有QueueItem的活动状态。我可以动态地创建新队列,但无论我如何努力,自定义消费者都不会从中消费。我希望该应用程序:

  • 重新启动自定义使用者(我尝试了
    app.control.broadcast('pool\u restart')
  • 添加队列并使用自定义使用者使用它。(我尝试了
    app.control.add\u消费者(…)
  • 优雅地重新启动所有工作人员,当我手动操作时,这些工作人员将拾取新设置
  • 我已经成功地创建了一个新队列。我已经成功地将其附加到默认芹菜消费者。我想以某种方式将其附加到自定义消费者,以便
    on_消息
    回调可以处理它

    我觉得我已经很接近了,但只是错过了芹菜/科姆布API的一小部分

    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()