示例#1
0
文件: amqp.py 项目: konetzed/reddwarf
 def __init__(self, topic, connection=None):
     self.exchange = "%s_fanout" % topic
     self.queue = "%s_fanout" % topic
     self.durable = False
     self.auto_delete = True
     LOG.info(_('Creating "%(exchange)s" fanout exchange'), dict(exchange=self.exchange))
     super(FanoutPublisher, self).__init__(connection=connection)
示例#2
0
 def __init__(self, topic, connection=None):
     self.exchange = '%s_fanout' % topic
     self.queue = '%s_fanout' % topic
     self.durable = False
     self.auto_delete = True
     LOG.info(_('Creating "%(exchange)s" fanout exchange'),
              dict(exchange=self.exchange))
     super(FanoutPublisher, self).__init__(connection=connection)
示例#3
0
 def __init__(self, connection=None, topic='broadcast', proxy=None):
     self.exchange = '%s_fanout' % topic
     self.routing_key = topic
     unique = uuid.uuid4().hex
     self.queue = '%s_fanout_%s' % (topic, unique)
     self.durable = False
     # Fanout creates unique queue names, so we should auto-remove
     # them when done, so they're not left around on restart.
     # Also, we're the only one that should be consuming.  exclusive
     # implies auto_delete, so we'll just set that..
     self.exclusive = True
     LOG.info(_('Created "%(exchange)s" fanout exchange '
                'with "%(key)s" routing key'),
              dict(exchange=self.exchange, key=self.routing_key))
     super(FanoutAdapterConsumer, self).__init__(connection=connection,
                                 topic=topic, proxy=proxy)
示例#4
0
class Connection(object):
    """Connection object."""
    def __init__(self):
        self.consumers = []
        self.consumer_thread = None
        self.max_retries = FLAGS.rabbit_max_retries
        # Try forever?
        if self.max_retries <= 0:
            self.max_retries = None
        self.interval_start = FLAGS.rabbit_retry_interval
        self.interval_stepping = FLAGS.rabbit_retry_backoff
        # max retry-interval = 30 seconds
        self.interval_max = 30
        self.memory_transport = False

        self.params = dict(hostname=FLAGS.rabbit_host,
                           port=FLAGS.rabbit_port,
                           userid=FLAGS.rabbit_userid,
                           password=FLAGS.rabbit_password,
                           virtual_host=FLAGS.rabbit_virtual_host)
        if FLAGS.fake_rabbit:
            self.params['transport'] = 'memory'
            self.memory_transport = True
        else:
            self.memory_transport = False
        self.connection = None
        self.reconnect()

    def reconnect(self):
        """Handles reconnecting and re-estblishing queues"""
        if self.connection:
            try:
                self.connection.close()
            except self.connection.connection_errors:
                pass
            time.sleep(1)
        self.connection = kombu.connection.BrokerConnection(**self.params)
        if self.memory_transport:
            # Kludge to speed up tests.
            self.connection.transport.polling_interval = 0.0
        self.consumer_num = itertools.count(1)

        try:
            self.connection.ensure_connection(
                errback=self.connect_error,
                max_retries=self.max_retries,
                interval_start=self.interval_start,
                interval_step=self.interval_stepping,
                interval_max=self.interval_max)
        except self.connection.connection_errors, e:
            # We should only get here if max_retries is set.  We'll go
            # ahead and exit in this case.
            err_str = str(e)
            max_retries = self.max_retries
            LOG.error(
                _('Unable to connect to AMQP server '
                  'after %(max_retries)d tries: %(err_str)s') % locals())
            sys.exit(1)
        LOG.info(
            _('Connected to AMQP server on %(hostname)s:%(port)d' %
              self.params))
        self.channel = self.connection.channel()
        # work around 'memory' transport bug in 1.1.3
        if self.memory_transport:
            self.channel._new_queue('ae.undeliver')
        for consumer in self.consumers:
            consumer.reconnect(self.channel)
        if self.consumers:
            LOG.debug(_("Re-established AMQP queues"))
示例#5
0
class Connection(object):
    """Connection object."""
    def __init__(self, server_params=None):
        self.session = None
        self.consumers = {}
        self.consumer_thread = None

        if server_params is None:
            server_params = {}

        default_params = dict(hostname=FLAGS.qpid_hostname,
                              port=FLAGS.qpid_port,
                              username=FLAGS.qpid_username,
                              password=FLAGS.qpid_password)

        params = server_params
        for key in default_params.keys():
            params.setdefault(key, default_params[key])

        self.broker = params['hostname'] + ":" + str(params['port'])
        # Create the connection - this does not open the connection
        self.connection = qpid.messaging.Connection(self.broker)

        # Check if flags are set and if so set them for the connection
        # before we call open
        self.connection.username = params['username']
        self.connection.password = params['password']
        self.connection.sasl_mechanisms = FLAGS.qpid_sasl_mechanisms
        self.connection.reconnect = FLAGS.qpid_reconnect
        if FLAGS.qpid_reconnect_timeout:
            self.connection.reconnect_timeout = FLAGS.qpid_reconnect_timeout
        if FLAGS.qpid_reconnect_limit:
            self.connection.reconnect_limit = FLAGS.qpid_reconnect_limit
        if FLAGS.qpid_reconnect_interval_max:
            self.connection.reconnect_interval_max = (
                FLAGS.qpid_reconnect_interval_max)
        if FLAGS.qpid_reconnect_interval_min:
            self.connection.reconnect_interval_min = (
                FLAGS.qpid_reconnect_interval_min)
        if FLAGS.qpid_reconnect_interval:
            self.connection.reconnect_interval = FLAGS.qpid_reconnect_interval
        self.connection.hearbeat = FLAGS.qpid_heartbeat
        self.connection.protocol = FLAGS.qpid_protocol
        self.connection.tcp_nodelay = FLAGS.qpid_tcp_nodelay

        # Open is part of reconnect -
        # NOTE(WGH) not sure we need this with the reconnect flags
        self.reconnect()

    def _register_consumer(self, consumer):
        self.consumers[str(consumer.get_receiver())] = consumer

    def _lookup_consumer(self, receiver):
        return self.consumers[str(receiver)]

    def reconnect(self):
        """Handles reconnecting and re-establishing sessions and queues"""
        if self.connection.opened():
            try:
                self.connection.close()
            except qpid.messaging.exceptions.ConnectionError:
                pass

        while True:
            try:
                self.connection.open()
            except qpid.messaging.exceptions.ConnectionError, e:
                LOG.error(_('Unable to connect to AMQP server: %s ' % str(e)))
                time.sleep(FLAGS.qpid_reconnect_interval or 1)
            else:
                break

        LOG.info(_('Connected to AMQP server on %s' % self.broker))

        self.session = self.connection.session()

        for consumer in self.consumers.itervalues():
            consumer.reconnect(self.session)

        if self.consumers:
            LOG.debug(_("Re-established AMQP queues"))