消费来自Celery的SQS消息

时间:2019-04-01 13:29:15

标签: python amazon-sqs django-celery

我的Python应用程序中有一个Celery实现。我使用的经纪人是SQS。发送到SQS的消息是通过Boto3的send_message()API来自其他应用程序的。现在,我的困惑是如何触发Celery从SQS中提取消息进行处理。 Celery中将运行一些任务,该任务应正确处理来自SQS的消息。我的要求类似于Celery Consumer SQS Messages

据我了解,Celery会轮询SQS,直到消息到达那里。有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

我每20秒调用一次此任务:

@app.task(name='listen_to_sqs_telemetry')
def listen_to_sqs_telemetry():
    logger.info('start listen_to_telemetry')
    sqs = get_sqs_client()
    queue_url = 'https://sqs.us-east-2.amazonaws.com/xxx'
    logger.info('Using ' + queue_url)

    keep_going = True
    num = 0
    while keep_going:
        keep_going = False
        try:
            response = sqs.receive_message(
                QueueUrl=queue_url,
                AttributeNames=[
                    'SentTimestamp',
                ],
                MaxNumberOfMessages=5,
                MessageAttributeNames=[
                    'All'
                ],
                WaitTimeSeconds=20
            )
            # logger.info(response)
            if 'Messages' in response:
                keep_going = True
                for rec in response['Messages']:
                    # Process message
                    sqs.delete_message(
                        QueueUrl=queue_url,
                        ReceiptHandle=rec['ReceiptHandle']
                    )
                    num = num + 1
            else:
                pass
                # logger.info(response)
        except Exception as e:
            logger.error(str(e))
    logger.info('done with listen_to_sqs_telemetry')
    return "Processed {} message(s)".format(num)

答案 1 :(得分:0)

如果我了解您,请尝试将工作程序作为守护程序运行。使用主管等工具进行操作。