Esempio n. 1
0
    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)
Esempio n. 2
0
                    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))
Esempio n. 3
0
                    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))