def messages(self, attributes='All', visibilityTimeout=None, autodelete=True, neverfail=True): """ Generator to retrieve infinitely messages from a queue @param visibilityTimeout: @type visibilityTimeout: int @param autodelete: the message deletion will be attempted upon release @type autodelete: bool @param neverfail: don't fail on aws exceptions @type neverfail: bool @rtype: SQSMessage """ while True: try: items = self.sqsclient.receiveMessage(self.qName, attributes, maxNumberOfMessages = 1, visibilityTimeout = visibilityTimeout, waitTimeSeconds = 20) except Exception as e: if neverfail: self.logger.warn('receiveMessage error [%s]', e) time.sleep(self.COOLDOWN_BETWEEN_RECEIVEMESSAGES) continue raise if items == []: time.sleep(self.COOLDOWN_BETWEEN_RECEIVEMESSAGES) continue item = items[0] message = SQSMessage(item['Body']) message.id = item['MessageId'] message.receiptHandle = item['ReceiptHandle'] message.queue = self message.visibilityTimeout = visibilityTimeout message.receptionTimestamp = time.time() for attribute in item['Attribute']: setattr(message, attribute['Name'], attribute['Value']) yield message if autodelete: timeleft = message.visibilityTimeoutLeft() if timeleft < 0: self.logger.warn('Missed the message deletion by %s s. %s', -1*timeleft, message) else: try: self.delete(message) except Exception as e: if neverfail: self.logger.warn("Could not delete the message %s [%s]", message, e) raise