def handle_messages(self, message_generator): retries = int(self.config_get("retries")) interval = int(self.config_get("interval")) max_wait = int(self.config_get("max_wait")) failures_before_reauth = int(self.config_get("failures_before_reauth")) conn, headers = self.new_http_connection() for payload in message_generator(): try: entity = dict(content=payload, id=payload["message_id"], event_type=payload["event_type"]) payload_body = yagi.serializer.atom.dump_item(entity) except KeyError, e: LOG.error("Malformed Notification: %s" % payload) LOG.exception(e) continue endpoint = self.config_get("url") tries = 0 failures = 0 while True: try: self._send_notification(endpoint, endpoint, headers, payload_body, conn) break except MessageDeliveryFailed, e: stats.increment_stat(yagi.stats.failure_message()) LOG.exception(e) # Number of overall tries tries += 1 # Number of tries between re-auth attempts failures += 1 # Used primarily for testing, but it's possible we don't # care if we lose messages? if retries > 0: tries += 1 if tries >= retries: break wait = min(tries * interval, max_wait) LOG.error("Message delivery failed, going to sleep, will " "try again in %s seconds" % str(wait)) time.sleep(wait) if failures >= failures_before_reauth: # Don't always try to reconnect, give it a few # tries first failures = 0 conn, headers = self.new_http_connection(force=True) except UnauthorizedException: LOG.exception(e) conn, headers = self.new_http_connection(force=True)
LOG.exception(e) connection = None code = 401 error_msg = "Unauthorized" except MessageDeliveryFailed, e: LOG.exception(e) code = e.code error_msg = e.msg except Exception, e: code = 0 #aka 'unknown failure' error_msg = "CufPub General Delivery Failure to %s with: %s" % (endpoint, e) LOG.error(error_msg) LOG.exception(e) #If we got here, something failed. stats.increment_stat(yagi.stats.failure_message()) # Number of overall tries tries += 1 # Number of tries between re-auth attempts failures += 1 # Used primarily for testing, but it's possible we don't # care if we lose messages? if retries > 0: if tries >= retries: msg = "Exceeded retry limit. Error %s" % error_msg results[msgid] = dict(error=False, code=code, message=msg) break wait = min(tries * interval, max_wait) LOG.error("Message delivery failed, going to sleep, will " "try again in %s seconds" % str(wait))
conn = None code = 401 error_msg = "Unauthorized" except MessageDeliveryFailed, e: LOG.exception(e) code = e.code error_msg = e.msg except Exception, e: code = 0 #aka 'unknown failure' error_msg = "AtomPub General Delivery Failure to %s with: %s" % ( endpoint, e) LOG.error(error_msg) LOG.exception(e) #If we got here, something failed. stats.increment_stat(yagi.stats.failure_message()) # Number of overall tries tries += 1 # Number of tries between re-auth attempts failures += 1 # Used primarily for testing, but it's possible we don't # care if we lose messages? if retries > 0: if tries >= retries: msg = "Exceeded retry limit. Error %s" % error_msg self.note_result(env, payload, code=code, message=msg) break wait = min(tries * interval, max_wait) LOG.error("Message delivery failed, going to sleep, will " "try again in %s seconds" % str(wait))