【问题标题】:Can a celery worker/server accept tasks from a non celery producer?芹菜工人/服务器可以接受来自非芹菜生产者的任务吗?
【发布时间】:2012-08-11 11:29:52
【问题描述】:

我想使用一个用 java nio 编写的彗星服务器来发送实时更新。接收信息时,我希望它扫描数据,并通过rabbitmq 将任务发送到工作线程。理想情况下,我希望 celery 服务器位于 rabbit 的另一端,管理将处理这些任务的工作线程池。

但是,据我了解,celery 的工作原理是坐在rabbitmq 的两端,并且通过嵌入消费者和生产者的代码中,它实质上接管了生产者和消费者的角色。有没有办法像我上面描述的那样设置芹菜?谢谢

【问题讨论】:

    标签: rabbitmq celery


    【解决方案1】:

    不必使用 Celery 发布消息。您可以从自己的应用程序向 RabbitMQ 或其他代理发布消息,并使用 Celery 来消费任务。

    Celery 使用简单的消息protocol。您可以在您的应用程序中实现客户端。

    如果您不想实现协议的客户端,您可以实现一个简单的 http 服务器,它接受请求并进行适当的调用。喜欢this

    【讨论】:

      【解决方案2】:

      是的,当然!

      您可以将Custom Message Consumers 添加到 celery 应用中。

      请参考 celery 文档中的Extensions and Bootsteps

      这是上面链接中的部分示例代码:

      from celery import Celery
      from celery import bootsteps
      from kombu import Consumer, Exchange, Queue
      
      my_queue = Queue('custom', Exchange('custom'), 'routing_key')
      
      app = Celery(broker='amqp://')
      
      
      class MyConsumerStep(bootsteps.ConsumerStep):
      
          def get_consumers(self, channel):
              return [Consumer(channel,
                               queues=[my_queue],
                               callbacks=[self.handle_message],
                               accept=['json'])]
      
          def handle_message(self, body, message):
              print('Received message: {0!r}'.format(body))
              message.ack()
      app.steps['consumer'].add(MyConsumerStep)
      

      测试一下:

      python -m celery -A 主要工作者

      另见:Using Celery with existing RabbitMQ messages

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        • 2016-03-31
        • 2021-02-21
        • 2014-07-14
        • 2019-09-18
        • 2019-08-22
        • 1970-01-01
        相关资源
        最近更新 更多