2017-02-10 1 views
2

J'utilise boto3 pour recevoir un message() par lots. Cela renvoie un élément dict comme spécifié dans le boto3 documentation.Batch supprime les messages SQS après la réception d'un lot dans boto3

Après avoir reçu le lot de message, je les traite un par un et je veux les supprimer par lots après leur traitement. Je ne veux pas les supprimer un par un après le traitement de chaque élément. La fonction delete_message_batch() a une syntaxe légèrement différente de la réponse de la fonction receive_message(), j'ai donc besoin de reformater la réponse de receive_message() dans un format approprié (en utilisant seulement Id et ReceiptHandle).

Existe-t-il un moyen plus simple d'utiliser directement la réponse de receive_message() pour la suppression par lots?

Répondre

1

Voici comment je gère les messages. Je crée une liste avec les identifiants et les poignées de réception. Les identifiants ne sont pas obligatoires, vous pouvez insérer la sortie de range (10). En outre, il n'y a pas de vérification d'erreur, vous devez donc prendre soin de cela.

response = SQS.receive_message(QueueUrl=queue_url, 
           AttributeNames=[], 
           MaxNumberOfMessages=10, 
           MessageAttributeNames=['All']) 
delete_batch = [] 
for message in response.get('Messages') or []: 
    # do stuff with each message 
    delete_batch.append({'Id': message['MessageId'], 
         'ReceiptHandle': message['ReceiptHandle']}) 
if delete_batch: 
    SQS.delete_message_batch(QueueUrl=queue_url, Entries=delete_batch)