How to get all messages in Amazon SQS queue using boto library in Python?

后端 未结 6 2156
陌清茗
陌清茗 2021-02-05 10:49

I\'m working on an application whose workflow is managed by passing messages in SQS, using boto.

My SQS queue is growing gradually, and I have no way to check how many e

6条回答
  •  一生所求
    2021-02-05 11:03

    NOTE: This is not intended as a direct answer to the question. Rather it is an augmentation to @TimothyLiu's answer, assuming the end-user is using the Boto package (aka Boto2) not Boto3. This code is a "Boto-2-ization" of the delete_messages call referred to in his answer


    A Boto(2) call for delete_message_batch(messages_to_delete) where messages_to_delete is a dict object with key:value corresponding to id:receipt_handle pairs returns

    AttributeError: 'dict' object has no attribute 'id'.

    It seems delete_message_batch expects a Message class object; copying the Boto source for delete_message_batch and allowing it to use a non-Message object (ala boto3) also fails if you're deleting more than 10 "messages" at a time. So, I had to use the following work-around.

    eprint code from here

    from __future__ import print_function
    import sys
    from itertools import islice
    
    def eprint(*args, **kwargs):
        print(*args, file=sys.stderr, **kwargs)
    
    @static_vars(counter=0)
    def take(n, iterable, reset=False):
        "Return next n items of the iterable as same type"
        if reset: take.counter = 0
        take.counter += n
        bob = islice(iterable, take.counter-n, take.counter)
        if isinstance(iterable, dict): return dict(bob)
        elif isinstance(iterable, list): return list(bob)
        elif isinstance(iterable, tuple): return tuple(bob)
        elif isinstance(iterable, set): return set(bob)
        elif isinstance(iterable, file): return file(bob)
        else: return bob
    
    def delete_message_batch2(cx, queue, messages): #returns a string reflecting level of success rather than throwing an exception or True/False
      """
      Deletes a list of messages from a queue in a single request.
      :param cx: A boto connection object.
      :param queue: The :class:`boto.sqs.queue.Queue` from which the messages will be deleted
      :param messages: List of any object or structure with id and receipt_handle attributes such as :class:`boto.sqs.message.Message` objects.
      """
      listof10s = []
      asSuc, asErr, acS, acE = "","",0,0
      res = []
      it = tuple(enumerate(messages))
      params = {}
      tenmsg = take(10,it,True)
      while len(tenmsg)>0:
        listof10s.append(tenmsg)
        tenmsg = take(10,it)
      while len(listof10s)>0:
        tenmsg = listof10s.pop()
        params.clear()
        for i, msg in tenmsg: #enumerate(tenmsg):
          prefix = 'DeleteMessageBatchRequestEntry'
          numb = (i%10)+1
          p_name = '%s.%i.Id' % (prefix, numb)
          params[p_name] = msg.get('id')
          p_name = '%s.%i.ReceiptHandle' % (prefix, numb)
          params[p_name] = msg.get('receipt_handle')
        try:
          go = cx.get_object('DeleteMessageBatch', params, BatchResults, queue.id, verb='POST')
          (sSuc,cS),(sErr,cE) = tup_result_messages(go)
          if cS:
            asSuc += ","+sSuc
            acS += cS
          if cE:
            asErr += ","+sErr
            acE += cE
        except cx.ResponseError:
          eprint("Error in batch delete for queue {}({})\nParams ({}) list: {} ".format(queue.name, queue.id, len(params), params))
        except:
          eprint("Error of unknown type in batch delete for queue {}({})\nParams ({}) list: {} ".format(queue.name, queue.id, len(params), params))
      return stringify_final_tup(asSuc, asErr, acS, acE, expect=len(messages)) #mdel #res
    
    def stringify_final_tup(sSuc="", sErr="", cS=0, cE=0, expect=0):
      if sSuc == "": sSuc="None"
      if sErr == "": sErr="None"
      if cS == expect: sSuc="All"
      if cE == expect: sErr="All"
      return "Up to {} messages removed [{}]\t\tMessages remaining ({}) [{}]".format(cS,sSuc,cE,sErr)
    

提交回复
热议问题