Exemple #1
0
def cast(msg, event_type, topic, priority):
    yagi.config.setup(config_path="/etc/yagi.conf")
    conf = yagi.config.config_with("rabbit_broker")
    host = conf("host")
    port = conf("port")
    user = conf("user")
    exchange = conf("exchange")
    password = conf("password")
    vhost = conf("vhost")

    message_dict = {
        "message_id": str(uuid.uuid4()),
        "event_type": event_type,
        "publisher_id": "some_publisher",
        "priority": priority,
        "timestamp": str(datetime.datetime.utcnow()),
        "payload": msg,
    }
    conn = BrokerConnection(hostname=host, port=port, userid=user, password=password, virtual_host=vhost)
    publisher = Publisher(
        connection=conn,
        exchange=exchange,
        routing_key="%s.%s" % (topic, priority),
        durable=False,
        exchange_type="topic",
    )
    publisher.send(message_dict)
    publisher.close()
Exemple #2
0
    def return_response(self, response, qid):
        """AMQP "response" handler.
        
        Publishes a response message to a temporary queue.
        - response is json, qid is string
        """
        message = json.dumps(response)
        routing_key = self.response_routing_key % qid
        logging.debug("response to %s with routing_key: %s, message: \n%s" % (self.exchange_name, routing_key, message))
        try:
            publisher = Publisher(
                connection=self.amqp_connection,
                exchange=self.exchange_name,
                exchange_type="topic",
                routing_key=routing_key,
                )
            publisher.send(message)
            publisher.close()
        except:
            """Trying to send with broken connection.

            Handle gracefully by waiting for connection and publish again."""
            logging.error('%s AMQP error: %s' % (self.service_name, sys.exc_info()[1]))
            self._wait_connection(5)
            self.return_response(response, qid)
Exemple #3
0
class Worker(object):
    def __init__(self, hostname="localhost", port=5672, userid="collectoruser", password="******", **options):

        conn = BrokerConnection(
            hostname=hostname, port=port, userid=userid, password=password, virtual_host="collectorvhost"
        )

        try:
            self.publisher = Publisher(
                connection=conn,
                exchange="collector.response",
                exchange_type="direct",
                routing_key="response",
                serializer="json",
            )
        except Exception as ex:
            raise Worker.ConnectionException(ex)

        self.consumer = Consumer(
            connection=conn, queue="feed", exchange_type="topic", exchange="collector", routing_key="collector.*.*"
        )

    def run(self):
        self.consumer.register_callback(self._get_request_callback)
        print "Waiting..."
        self.consumer.wait()

    def _get_request_callback(self, message_data, message):
        # print "message_data=%s" % message_data
        drivers = []
        drivers.append(message_data)
        DRIVER_KEY = "driver_routing_key"
        TAGS_KEY = "tags"
        for obj in drivers:
            driver = None
            if DRIVER_KEY in obj and TAGS_KEY in obj:
                module_name = obj["driver_routing_key"]
                try:
                    __import__(module_name)
                    module = sys.modules[module_name]
                    driver = module.Driver()
                except:
                    print "could not import module %s" % module_name
                values = []
                for tag in obj["tags"]:
                    if driver:
                        value = driver.read_value(tag["device"], tag["address"])
                    else:
                        value = "BAD_DRIVER"
                    values.append({"name": tag["name"], "current_value": value, "read_at": "2009-01-01"})
                self.publisher.send(values)
            else:
                print "Badly formated request %s" % obj
        message.ack()

    class WorkerException(Exception):
        pass

    class ConnectionException(WorkerException):
        pass
Exemple #4
0
def _send_message(connection, routing_key, data, envelope):

    # Make a message envelope if we are told to have one
    if envelope:
        message = {}
        message["payload"] = data
        message["_meta"] = {
            "exchange": CONF["MSG_EXCHANGE"],
            "routing_key": routing_key,
            "sent": mercurial.util.datestr(None, CONF["DATE_FORMAT"]),
            # TODO: Support more than just JSON
            "serializer": "json",
        }
    else:
        message = data

    # Set up our broker publisher
    publisher = Publisher(
        connection=connection, exchange=CONF["MSG_EXCHANGE"], exchange_type="topic", routing_key=routing_key
    )

    # Send the message
    # TODO: Support more than just JSON
    publisher.send(message)

    # Close the publishing connection
    publisher.close()
Exemple #5
0
    def __init__(self,
                 hostname='localhost',
                 port=5672,
                 userid="collectoruser",
                 password="******",
                 **options):

        conn = BrokerConnection(hostname=hostname,
                                port=port,
                                userid=userid,
                                password=password,
                                virtual_host='collectorvhost')

        try:
            self.publisher = Publisher(connection=conn,
                                       exchange="collector.response",
                                       exchange_type='direct',
                                       routing_key="response",
                                       serializer="json")
        except Exception as ex:
            raise Worker.ConnectionException(ex)

        self.consumer = Consumer(connection=conn,
                                 queue="feed",
                                 exchange_type='topic',
                                 exchange="collector",
                                 routing_key="collector.*.*")
Exemple #6
0
def _send_message(routing_key, request):
    conn = DjangoAMQPConnection()
    publisher = Publisher(connection=conn, exchange='request', 
                          exchange_type='topic', routing_key=routing_key, 
                          serializer='pickle')
    publisher.send(request)
    publisher.close()
    conn.close()
Exemple #7
0
def reply(routing_key, data):
    from carrot.connection import DjangoBrokerConnection
    from carrot.messaging import Publisher

    conn = DjangoBrokerConnection()
    publisher = Publisher(connection=conn, exchange="django", routing_key=routing_key, exchange_type="topic")
    publisher.send(data)
    publisher.close()
    conn.close()
Exemple #8
0
 def sender_callback(self, routing_key, data):
     conn = DjangoBrokerConnection()
     publisher = Publisher(connection=conn,
                           exchange="django_send",
                           routing_key=routing_key,
                           exchange_type="topic",
                           )
     publisher.send(data)
     publisher.close()
     conn.close()
     print "Sent object change/delete message for %s" % routing_key
def request_no_response():
    """No response"""
    data = {'q': 'hello AMQP backend, I am Python'}

    broker = ExampleBroker()
    publisher = Publisher(
        connection=broker.amqp_connection,
        exchange=broker.exchange_name,
        exchange_type="topic",
        routing_key=broker.binding_key,
    )
    publisher.send(json.dumps(data))
def request_no_response():
    """No response"""
    data = {'q': 'hello AMQP backend, I am Python'}

    broker = ExampleBroker()
    publisher = Publisher(
        connection = broker.amqp_connection,
        exchange = broker.exchange_name,
        exchange_type = "topic",
        routing_key = broker.binding_key,
        )
    publisher.send(json.dumps(data))
Exemple #11
0
 def test_amqp(self):
     from carrot.connection import DjangoBrokerConnection
     from carrot.messaging import Publisher, Consumer
     
     connection = DjangoBrokerConnection()
     publisher = Publisher(connection=connection,
                           exchange="collector",
                           exchange_type='topic',
                           routing_key="collector.driver",
                           serializer='json')
     publisher.send("test")
     publisher.close()
     connection.close()
Exemple #12
0
def send_msg(routing_key, data):
    conn = BrokerConnection(
                hostname=settings.BROKER_HOST,
                port=settings.BROKER_PORT,
                userid=settings.BROKER_USER,
                password=settings.BROKER_PASSWORD,
                virtual_host=settings.BROKER_VHOST)
    publisher = Publisher(connection=conn,
                          exchange="django_send",
                          routing_key=routing_key,
                          exchange_type="topic",
                          )
    publisher.send(data)
    publisher.close()
    conn.close()
 def create_publisher(self, exchange=None, routing_key=None, **options):
     exchange = exchange or self.exchange
     routing_key = routing_key or self.routing_key
     return Publisher(connection=self.conn,
                      exchange=exchange,
                      routing_key=routing_key,
                      **options)
Exemple #14
0
 def test_consumer_interface(self):
     to_send = ['No', 'soup', 'for', 'you!']
     messages = []
     def cb(message_data, message):
         messages.append(message_data)
     conn = BrokerConnection(backend_cls='memory')
     consumer = Consumer(connection=conn, queue="test",
                         exchange="test", routing_key="test")
     consumer.register_callback(cb)
     publisher = Publisher(connection=conn, exchange="test",
                           routing_key="test")
     for i in to_send:
         publisher.send(i)
     it = consumer.iterconsume()
     for i in range(len(to_send)):
         it.next()
     self.assertEqual(messages, to_send)
Exemple #15
0
 def enable(self):
     conf = self.app.conf
     self.enabled = True
     self.publisher = Publisher(self.connection,
                             exchange=conf.CELERY_EVENT_EXCHANGE,
                             exchange_type=conf.CELERY_EVENT_EXCHANGE_TYPE,
                             routing_key=conf.CELERY_EVENT_ROUTING_KEY,
                             serializer=conf.CELERY_EVENT_SERIALIZER)
def send_requests(requests, **options):
    logger = logging
    if 'logger' in options.keys():
        logger = options['logger']
        
    """Send a import request message to be picked up by workers."""
    connection = DjangoBrokerConnection()
    publisher = Publisher(connection=connection,
                              exchange="collector",
                              exchange_type='topic',
                              routing_key="collector.driver",
                              serializer='json')
    for req in requests:
        routing_key=req['driver_routing_key']        
        publisher.send(req, routing_key=routing_key)
        logger.debug("Sent request with routing_key %s:%s" %( routing_key,req,  ))
    publisher.close()
    connection.close()
Exemple #17
0
    def publish(self, message):

        # Make suere there is an exchange given
        if not self.exchange:
            raise InvalidExchange(self.exchange)

        # Make sure there is a message given
        if not message:
            raise MalformedMessage(message)

        # Have the message prepare and validate itself
        message._prepare()

        # Connect to the broker if we haven't already
        if not self.connection:
            self.connect()

        # Set up our broker publisher
        self.publisher = Publisher(connection=self.connection,
                                   exchange=self.exchange,
                                   exchange_type="topic",
                                   routing_key=message.routing_key)

        # The message is actually a simple envelope format with a payload and
        # some metadata
        final_data = {}
        final_data['payload'] = message.data
        final_data['_meta'] = message.metadata.copy()
        final_data['_meta'].update({
            'exchange':
            self.exchange,
            'routing_key':
            message.routing_key,
            'serializer':
            self.config.serializer,
            'sent':
            time_to_string(datetime.now(timezone(self.config.broker_timezone)))
        })

        # Send the message
        self.publisher.send(final_data, serializer=self.config.serializer)

        # Close the publishing connection
        self.publisher.close()
Exemple #18
0
def main():
    connection = BrokerConnection(
        hostname = "localhost",
        port = 5672,
        userid = "test",
        password = "******",
        virtual_host = "test.com",
    )
    
    publisher = Publisher(
        connection = connection,
        exchange = "messages",
        routing_key = "awesome",
    )
    
    for i in xrange(100):
        publisher.send({"a": i})
    
    publisher.close()
Exemple #19
0
class AMQPTransmitter(Transmitter):
    def __init__(self, hostname='localhost', port=5672,
                 userid=None, password=None, virtual_host=None,
                 exchange=None):
        self.hostname = hostname
        self.port = port
        self.userid = userid
        self.password = password
        self.virtual_host = None
        self.exchange = exchange

        self.connection = BrokerConnection(hostname=self.hostname, port=self.port,
                                           userid=self.userid, password=self.password,
                                           virtual_host=self.virtual_host)
        self.publisher = Publisher(connection=self.connection,
                                   exchange=exchange)

    def transmit(self, message):
        self.publisher.send(message)
class RabbitMQPipeline(object):
    def __init__(self, hostname, port, user_id, password, virtual_host, encoder_class):
        self.queue_connection = BrokerConnection(
            hostname=hostname,
            port=port,
            userid=user_id,
            password=password,
            virtual_host=virtual_host
        )

        self.encoder = encoder_class()

        # Setup / Teardown Rabbit plumbing when spider opens / closes
        dispatcher.connect(self.spider_opened, signals.spider_opened)
        dispatcher.connect(self.spider_closed, signals.spider_closed)

    @classmethod
    def from_settings(cls, settings):
        hostname      = settings.get('BROKER_HOST')
        port          = settings.get('BROKER_PORT')
        user_id       = settings.get('BROKER_USERID')
        password      = settings.get('BROKER_PASSWORD')
        virtual_host  = settings.get('BROKER_VIRTUAL_HOST')
        encoder_class = settings.get('QUEUE_SERIALIZER', ScrapyJSONEncoder)

        return cls(hostname, port, user_id, password, virtual_host, encoder_class)

    def spider_opened(self, spider):
        self.publisher = Publisher(
            connection=self.queue_connection,
            exchange='',
            routing_key=spider.name
        )

    def spider_closed(self, spider):
        self.publisher.close()

    def process_item(self, item, spider):
        return deferToThread(self._process_item, item, spider)

    def _process_item(self, item, spider):
        self.publisher.send(self.encoder.encode(dict(item)))
        return item
def request_with_response():
    """Example of requesting over AMQP from another process, not necessarily Python."""
    qid = str(randrange(0,999))
    data = {'qid': qid, 'q': 'what time is it?'}

    broker = ExampleBroker()
    publisher = Publisher(
        connection = broker.amqp_connection,
        exchange = broker.exchange_name,
        exchange_type = "topic",
        routing_key = broker.binding_key,
        )
    
    # declare test queue for receiving response message
    backend = broker.amqp_connection.create_backend()
    backend.queue_declare(
        queue="test",
        durable=False,
        exclusive=False,
        auto_delete=True,)
    backend.queue_bind(
        "test",
        broker.exchange_name,
        broker.response_routing_key % qid)
    consumer = Consumer(
        connection=broker.amqp_connection,
        exchange=broker.exchange_name,
        exchange_type="topic",
        queue="test",
        )
    consumer.discard_all()

    # send message
    publisher.send(json.dumps(data))

    # allow data to pass the wire
    sleep(0.2)

    # retrieve response
    response = consumer.fetch()
    payload = json.loads(response.payload)
    print "Response from AMQP: %s" % payload
Exemple #22
0
class MessageQueuePipeline(object):
    def __init__(self, host_name, port, userid, password, virtual_host,
                 encoder_class):
        self.q_connection = BrokerConnection(hostname=host_name,
                                             port=port,
                                             userid=userid,
                                             password=password,
                                             virtual_host=virtual_host)
        self.encoder = encoder_class()

    @classmethod
    def from_settings(cls, settings):
        host_name = settings.get('BROKER_HOST', 'localhost')
        port = settings.get('BROKER_PORT', 5672)
        userid = settings.get('BROKER_USERID', "guest")
        password = settings.get('BROKER_PASSWORD', "guest")
        virtual_host = settings.get('BROKER_VIRTUAL_HOST', "/")
        encoder_class = settings.get('MESSAGE_Q_SERIALIZER', ScrapyJSONEncoder)
        return cls(host_name, port, userid, password, virtual_host,
                   encoder_class)

    @classmethod
    def from_crawler(cls, crawler):
        o = cls(crawler)
        crawler.signals.connect(o.spider_opened, signal=signals.spider_opened)
        crawler.signals.connect(o.spider_closed, signal=signals.spider_closed)
        return o

    def spider_opened(self, spider):
        self.publisher = Publisher(connection=self.q_connection,
                                   exchange="",
                                   routing_key=spider.name)

    def spider_closed(self, spider):
        self.publisher.close()

    def process_item(self, item, spider):
        return deferToThread(self._process_item, item, spider)

    def _process_item(self, item, spider):
        self.publisher.send({"scraped_data": self.encoder.encode(dict(item))})
        return item
Exemple #23
0
    def publish(self, exchange, routing_key, message,
                auto_declare=False, persistent=True):
        """publish a message to exchange using routing_key
        
        exchange        - name of exchange
        routing_key     - interpretation of routing key depends on exchange type
        message         - message content to send
        auto_declare    - automatically declare the exchange (default: false)
        persistent      - store message on disk as well as memory (default: True)
        """
        delivery_mode = 2
        if not persistent:
            delivery_mode = 1

        publisher = Publisher(connection=self.broker,
                              exchange=exchange, routing_key=routing_key,
                              auto_declare=auto_declare)

        publisher.send(message, delivery_mode=delivery_mode)
        publisher.close()
Exemple #24
0
class AmqpMessageProcessor(object):
    purge_every = datetime.timedelta(minutes=10)
    conn_lifetime = datetime.timedelta(minutes=getattr(settings, "ACCESS_KEY_TIMEOUT_MINUTES", 2))

    def __init__(self, connection):
        self.pygo_mp = PyGoWaveClientMessageProcessor()
        self.consumer = Consumer(
            connection,
            queue="wavelet_rpc_singlethread",
            exchange="wavelet.topic",
            routing_key="#.#.clientop",
            exchange_type="topic",
            serializer="json",
            auto_ack=True,
        )
        self.consumer.register_callback(self.receive)
        self.publisher = Publisher(
            connection, exchange="wavelet.direct", exchange_type="direct", delivery_mode=1, serializer="json"
        )

        self.pygo_mp.purge_connections()
        self.next_purge = datetime.datetime.now() + self.purge_every

    def wait(self, limit=None):
        self.consumer.wait(limit)

    def send(self, routing_key, message_data):
        self.publisher.send(message_data, routing_key=routing_key, delivery_mode=1)

    def receive(self, message_data, message):
        routing_key = message.amqp_message.routing_key

        msg_dict = self.pygo_mp.process(routing_key, message_data)

        for out_rkey, messages in msg_dict.iteritems():
            self.send(out_rkey, messages)

            # Cleanup time?
        if datetime.datetime.now() > self.next_purge:
            self.pygo_mp.purge_connections()
            self.next_purge = datetime.datetime.now() + self.purge_every
Exemple #25
0
    def __init__(self, exchange, queue, routing_key=None, debug=None):
        """
			Initialise signal, conection, exchange, queue and run consumer 
			@return: Django Signal like object.

			@param exchange: name of exchange for this signal
			@type exchange: string

			@param queue: name queue of this signal
			@type queue: string

			@param routing_key: name of routing_key betwen exchange and queue of this signal
			@type routing_key: string

			@param debug: debug flag
			@type debug: bool

			Example:
			>>> amqp_signal_1 = SignalAMQP(exchange="test1", queue="q1")
			>>> amqp_signal_2 = SignalAMQP(exchange="test2", queue="q2")
			>>> amqp_signal_1.queue_bind(['q2'])
			>>> def amqp_handler(sender, **kwargs):
				print "AMPQ handler:", sender, kwargs
			>>> amqp_signal_2.connect(amqp_handler, sender=None)
			>>> amqp_signal_1.send("Hello world!")
		"""
        super(SignalAMQP, self).__init__(providing_args=["message"])

        self.exchange = exchange
        self.queue = queue
        self.routing_key = routing_key
        self.debug = debug is None and settings.DEBUG or debug

        self.conn = DjangoBrokerConnection()
        self.publisher = Publisher(connection=self.conn, exchange=self.exchange, exchange_type="fanout",\
             routing_key=self.routing_key)
        self.consumer = Consumer(connection=self.conn, queue=self.queue, exchange_type="fanout",\
           exchange=self.exchange, routing_key=self.routing_key)
        self.consumer.register_callback(self.callback)

        self.cl = self.listen()
def request_with_response():
    """Example of requesting over AMQP from another process, not necessarily Python."""
    qid = str(randrange(0, 999))
    data = {'qid': qid, 'q': 'what time is it?'}

    broker = ExampleBroker()
    publisher = Publisher(
        connection=broker.amqp_connection,
        exchange=broker.exchange_name,
        exchange_type="topic",
        routing_key=broker.binding_key,
    )

    # declare test queue for receiving response message
    backend = broker.amqp_connection.create_backend()
    backend.queue_declare(
        queue="test",
        durable=False,
        exclusive=False,
        auto_delete=True,
    )
    backend.queue_bind("test", broker.exchange_name,
                       broker.response_routing_key % qid)
    consumer = Consumer(
        connection=broker.amqp_connection,
        exchange=broker.exchange_name,
        exchange_type="topic",
        queue="test",
    )
    consumer.discard_all()

    # send message
    publisher.send(json.dumps(data))

    # allow data to pass the wire
    sleep(0.2)

    # retrieve response
    response = consumer.fetch()
    payload = json.loads(response.payload)
    print "Response from AMQP: %s" % payload
Exemple #27
0
def main():
    logging.basicConfig(level=logging.DEBUG)
    args = parser.parse_args()
    conn = BrokerConnection(
        hostname=args.hostname,
        virtual_host=args.vhost,
        userid=args.user,
        password=args.password,
    )
    publisher = Publisher(auto_declare=False,
                          connection=conn,
                          exchange=args.exchange,
                          routing_key=args.key)
    logging.info("Declaring exchange: %s" % args.exchange)
    publisher.backend.exchange_declare(exchange=args.exchange,
                                       type="topic",
                                       durable=False,
                                       auto_delete=False)
    while True:
        line = sys.stdin.readline()
        if not line:
            break
        logging.debug("Sending message '%s'" % line.strip())
        publisher.send(line.strip())
    publisher.close()
Exemple #28
0
def cast(msg, event_type, topic, priority):
    yagi.config.setup(config_path='/etc/yagi.conf')
    conf = yagi.config.config_with('rabbit_broker')
    host = conf('host')
    port = conf('port')
    user = conf('user')
    exchange = conf('exchange')
    password = conf('password')
    vhost = conf('vhost')

    message_dict = {
        'message_id': str(uuid.uuid4()),
        'event_type': event_type,
        'publisher_id': 'some_publisher',
        'priority': priority,
        'timestamp': str(datetime.datetime.utcnow()),
        'payload': msg
        }
    conn = BrokerConnection(hostname=host, port=port, userid=user,
             password=password, virtual_host=vhost)
    publisher = Publisher(connection=conn, exchange=exchange,
            routing_key="%s.%s" % (topic, priority), durable=False,
            exchange_type='topic')
    publisher.send(message_dict)
    publisher.close()
Exemple #29
0
    def publish(self,
                exchange,
                routing_key,
                message,
                auto_declare=False,
                persistent=True):
        """publish a message to exchange using routing_key
        
        exchange        - name of exchange
        routing_key     - interpretation of routing key depends on exchange type
        message         - message content to send
        auto_declare    - automatically declare the exchange (default: false)
        persistent      - store message on disk as well as memory (default: True)
        """
        delivery_mode = 2
        if not persistent:
            delivery_mode = 1

        publisher = Publisher(connection=self.broker,
                              exchange=exchange,
                              routing_key=routing_key,
                              auto_declare=auto_declare)

        publisher.send(message, delivery_mode=delivery_mode)
        publisher.close()
Exemple #30
0
    def test_consumer_interface(self):
        to_send = ['No', 'soup', 'for', 'you!']
        messages = []

        def cb(message_data, message):
            messages.append(message_data)

        conn = BrokerConnection(backend_cls='memory')
        consumer = Consumer(connection=conn,
                            queue="test",
                            exchange="test",
                            routing_key="test")
        consumer.register_callback(cb)
        publisher = Publisher(connection=conn,
                              exchange="test",
                              routing_key="test")
        for i in to_send:
            publisher.send(i)
        it = consumer.iterconsume()
        for i in range(len(to_send)):
            it.next()
        self.assertEqual(messages, to_send)
Exemple #31
0
 def _dispatch_message(self, message):
     if not message.claim(self.context.db):
         return
     
     try:
         publisher = Publisher(self.context.broker, exchange=message.options.exchange,
                               exchange_type=message.options.exchange_type)
         publisher.send(message.message,
                        routing_key = message.options.routing_key,
                        delivery_mode = message.options.delivery_mode,
                        mandatory = message.options.mandatory,
                        priority = message.options.priority)
         publisher.close()
     except:
         log.error("Error dispatching deferred message %s: %s" % (message, traceback.format_exc()))
         self.error_reschedule(message)
         return False
     else:
         log.debug("Dispatched message %s" % message)
         # sent with no problems, done with it.
         self.context.db.delete(message)
         return True
Exemple #32
0
class MessageQueuePipeline(object):

    def __init__(self, host_name, port, userid, password, virtual_host, encoder_class):
        self.q_connection = BrokerConnection(hostname=host_name, port=port,
                        userid=userid, password=password,
                        virtual_host=virtual_host)
        self.encoder = encoder_class()

    @classmethod
    def from_settings(cls, settings):
        host_name = settings.get('BROKER_HOST', 'localhost')
        port = settings.get('BROKER_PORT', 5672)
        userid = settings.get('BROKER_USERID', "guest")
        password = settings.get('BROKER_PASSWORD', "guest")
        virtual_host = settings.get('BROKER_VIRTUAL_HOST', "/")
        encoder_class = settings.get('MESSAGE_Q_SERIALIZER', ScrapyJSONEncoder)
        return cls(host_name, port, userid, password, virtual_host, encoder_class)

    @classmethod
    def from_crawler(cls, crawler):
        o = cls(crawler)
        crawler.signals.connect(o.spider_opened, signal=signals.spider_opened)
        crawler.signals.connect(o.spider_closed, signal=signals.spider_closed)
        return o

    def spider_opened(self, spider):
        self.publisher = Publisher(connection=self.q_connection,
                        exchange="", routing_key=spider.name)

    def spider_closed(self, spider):
        self.publisher.close()

    def process_item(self, item, spider):
        return deferToThread(self._process_item, item, spider)

    def _process_item(self, item, spider):
        self.publisher.send({"scraped_data": self.encoder.encode(dict(item))})
        return item
Exemple #33
0
def main():
    logging.basicConfig(level=logging.DEBUG)
    args = parser.parse_args()
    conn = BrokerConnection(
            hostname=args.hostname,
            virtual_host=args.vhost,
            userid=args.user,
            password=args.password,
    )
    publisher = Publisher(
            auto_declare    = False,
            connection      = conn,
            exchange        = args.exchange,
            routing_key     = args.key
    )
    logging.info("Declaring exchange: %s" % args.exchange)
    publisher.backend.exchange_declare(exchange=args.exchange, type="topic", durable=False, auto_delete=False)
    while True:
        line = sys.stdin.readline()
        if not line:
            break
        logging.debug("Sending message '%s'" % line.strip())
        publisher.send(line.strip())
    publisher.close()
Exemple #34
0
    def __init__(self, connection):
        self.pygo_mp = PyGoWaveClientMessageProcessor()
        self.consumer = Consumer(
            connection,
            queue="wavelet_rpc_singlethread",
            exchange="wavelet.topic",
            routing_key="#.#.clientop",
            exchange_type="topic",
            serializer="json",
            auto_ack=True,
        )
        self.consumer.register_callback(self.receive)
        self.publisher = Publisher(
            connection, exchange="wavelet.direct", exchange_type="direct", delivery_mode=1, serializer="json"
        )

        self.pygo_mp.purge_connections()
        self.next_purge = datetime.datetime.now() + self.purge_every
Exemple #35
0
    def test_amqp(self):
        from carrot.connection import DjangoBrokerConnection
        from carrot.messaging import Publisher, Consumer

        connection = DjangoBrokerConnection()
        publisher = Publisher(connection=connection,
                              exchange="collector",
                              exchange_type='topic',
                              routing_key="collector.driver",
                              serializer='json')
        publisher.send("test")
        publisher.close()
        connection.close()
    def test_with_statement(self):

        with BrokerConnection(**test_connection_args()) as conn:
            self.assertFalse(conn._closed)
            with Publisher(connection=conn, exchange="F", routing_key="G") \
                    as publisher:
                self.assertFalse(publisher._closed)
        self.assertTrue(conn._closed)
        self.assertTrue(publisher._closed)

        with BrokerConnection(**test_connection_args()) as conn:
            self.assertFalse(conn._closed)
            with Consumer(connection=conn,
                          queue="E",
                          exchange="F",
                          routing_key="G") as consumer:
                self.assertFalse(consumer._closed)
        self.assertTrue(conn._closed)
        self.assertTrue(consumer._closed)
Exemple #37
0
    def __init__(self, hostname="localhost", port=5672, userid="collectoruser", password="******", **options):

        conn = BrokerConnection(
            hostname=hostname, port=port, userid=userid, password=password, virtual_host="collectorvhost"
        )

        try:
            self.publisher = Publisher(
                connection=conn,
                exchange="collector.response",
                exchange_type="direct",
                routing_key="response",
                serializer="json",
            )
        except Exception as ex:
            raise Worker.ConnectionException(ex)

        self.consumer = Consumer(
            connection=conn, queue="feed", exchange_type="topic", exchange="collector", routing_key="collector.*.*"
        )
Exemple #38
0
	def __init__(self, exchange, queue, routing_key=None, debug=None):
		"""
			Initialise signal, conection, exchange, queue and run consumer 
			@return: Django Signal like object.

			@param exchange: name of exchange for this signal
			@type exchange: string

			@param queue: name queue of this signal
			@type queue: string

			@param routing_key: name of routing_key betwen exchange and queue of this signal
			@type routing_key: string

			@param debug: debug flag
			@type debug: bool

			Example:
			>>> amqp_signal_1 = SignalAMQP(exchange="test1", queue="q1")
			>>> amqp_signal_2 = SignalAMQP(exchange="test2", queue="q2")
			>>> amqp_signal_1.queue_bind(['q2'])
			>>> def amqp_handler(sender, **kwargs):
				print "AMPQ handler:", sender, kwargs
			>>> amqp_signal_2.connect(amqp_handler, sender=None)
			>>> amqp_signal_1.send("Hello world!")
		"""
		super(SignalAMQP, self).__init__(providing_args=["message"])

		self.exchange = exchange
		self.queue = queue
		self.routing_key = routing_key
		self.debug = debug is None and settings.DEBUG or debug

		self.conn = DjangoBrokerConnection()
		self.publisher = Publisher(connection=self.conn, exchange=self.exchange, exchange_type="fanout",\
							routing_key=self.routing_key)
		self.consumer = Consumer(connection=self.conn, queue=self.queue, exchange_type="fanout",\
					exchange=self.exchange, routing_key=self.routing_key)
		self.consumer.register_callback(self.callback)

		self.cl = self.listen()
	def __init__(self, connection):
		self.consumer = Consumer(
			connection,
			queue="wavelet_rpc_singlethread",
			exchange="wavelet.topic",
			routing_key="#.#.clientop",
			exchange_type="topic",
			serializer="json",
			auto_ack=True,
		)
		self.consumer.register_callback(self.receive)
		self.publisher = Publisher(
			connection,
			exchange="wavelet.direct",
			exchange_type="direct",
			delivery_mode=1,
			serializer="json",
		)
		
		self.out_queue = {}
		self.purge_connections()
    def publish(self, message):

        # Make suere there is an exchange given
        if not self.exchange:
            raise InvalidExchange(self.exchange)

        # Make sure there is a message given
        if not message:
            raise MalformedMessage(message)

        # Have the message prepare and validate itself
        message._prepare()

        # Connect to the broker if we haven't already
        if not self.connection:
            self.connect()

        # Set up our broker publisher
        self.publisher = Publisher(connection=self.connection,
                                   exchange=self.exchange,
                                   exchange_type="topic",
                                   routing_key=message.routing_key)

        # The message is actually a simple envelope format with a payload and
        # some metadata
        final_data = {}
        final_data['payload'] = message.data
        final_data['_meta'] = message.metadata.copy()
        final_data['_meta'].update({
            'exchange': self.exchange,
            'routing_key': message.routing_key,
            'serializer': self.config.serializer,
            'sent': time_to_string(datetime.now(timezone(self.config.broker_timezone)))
        })

        # Send the message
        self.publisher.send(final_data, serializer=self.config.serializer)

        # Close the publishing connection
        self.publisher.close()
Exemple #41
0
def send_requests(requests, **options):
    logger = logging
    if 'logger' in options.keys():
        logger = options['logger']
    """Send a import request message to be picked up by workers."""
    connection = DjangoBrokerConnection()
    publisher = Publisher(connection=connection,
                          exchange="collector",
                          exchange_type='topic',
                          routing_key="collector.driver",
                          serializer='json')
    for req in requests:
        routing_key = req['driver_routing_key']
        publisher.send(req, routing_key=routing_key)
        logger.debug("Sent request with routing_key %s:%s" % (
            routing_key,
            req,
        ))
    publisher.close()
    connection.close()
Exemple #42
0
def create_README_publisher(amqpconn):
    from carrot.messaging import Publisher
    publisher = Publisher(connection=amqpconn, exchange=README_EXCHANGE,
                          routing_key=README_ROUTING_KEY)
    return publisher
Exemple #43
0
class GenericPublisher(object):
    def __init__(self, config, exchange=None, connect=True):
        self.config = config
        self.exchange = exchange
        self.connection = None
        if connect:
            self.connect()

    # Connect to the message broker
    def connect(self):
        if not self.connection:
            self.connection = BrokerConnection(hostname=self.config.host,
                                               port=self.config.port,
                                               userid=self.config.user,
                                               password=self.config.password,
                                               virtual_host=self.config.vhost)

    # Disconnect from the message broker
    def disconnect(self):
        if self.connection:
            self.connection.close()
            self.connection = None

    # Used to publish a pulse message to the proper exchange
    def publish(self, message):

        # Make suere there is an exchange given
        if not self.exchange:
            raise InvalidExchange(self.exchange)

        # Make sure there is a message given
        if not message:
            raise MalformedMessage(message)

        # Have the message prepare and validate itself
        message._prepare()

        # Connect to the broker if we haven't already
        if not self.connection:
            self.connect()

        # Set up our broker publisher
        self.publisher = Publisher(connection=self.connection,
                                   exchange=self.exchange,
                                   exchange_type="topic",
                                   routing_key=message.routing_key)

        # The message is actually a simple envelope format with a payload and
        # some metadata
        final_data = {}
        final_data['payload'] = message.data
        final_data['_meta'] = message.metadata.copy()
        final_data['_meta'].update({
            'exchange':
            self.exchange,
            'routing_key':
            message.routing_key,
            'serializer':
            self.config.serializer,
            'sent':
            time_to_string(datetime.now(timezone(self.config.broker_timezone)))
        })

        # Send the message
        self.publisher.send(final_data, serializer=self.config.serializer)

        # Close the publishing connection
        self.publisher.close()
Exemple #44
0
 def get_publisher(self, broker, **kwargs):
     return Publisher(broker, **kwargs)
from carrot.connection import BrokerConnection
from carrot.messaging import Publisher

import sys

conn = BrokerConnection(hostname="localhost", port=5672,
    userid="guest", password="******",
    virtual_host="/")

publisher = Publisher(connection=conn,
    exchange="sorting_room",
    routing_key="jason")

publisher.send({"po_box": sys.argv[1]})
publisher.close()
def send(exchange, routing_key, msg):
    publisher = Publisher(connection=conn,
                          exchange=exchange,
                          routing_key=routing_key)
    publisher.send(msg)
    publisher.close()
Exemple #47
0
 def create_publisher(self, **options):
     return Publisher(connection=self.conn,
                      exchange=self.exchange,
                      routing_key=self.routing_key,
                      **options)
Exemple #48
0
def get_publisher(routing_key):
    return Publisher(connection=get_carrot_connection(),
                     exchange=EXCHANGE_NAME,
                     exchange_type=EXCHANGE_TYPE,
                     routing_key=routing_key)
Exemple #49
0
 def spider_opened(self, spider):
     self.publisher = Publisher(connection=self.q_connection,
                                exchange="",
                                routing_key=spider.name)
Exemple #50
0
def get_publisher(config):
    return Publisher(connection=get_carrot_connection(config),
                     exchange=config.get('ckan.site_id'),
                     exchange_type=EXCHANGE_TYPE)
Exemple #51
0
class Worker(object):
    def __init__(self,
                 hostname='localhost',
                 port=5672,
                 userid="collectoruser",
                 password="******",
                 **options):

        conn = BrokerConnection(hostname=hostname,
                                port=port,
                                userid=userid,
                                password=password,
                                virtual_host='collectorvhost')

        try:
            self.publisher = Publisher(connection=conn,
                                       exchange="collector.response",
                                       exchange_type='direct',
                                       routing_key="response",
                                       serializer="json")
        except Exception as ex:
            raise Worker.ConnectionException(ex)

        self.consumer = Consumer(connection=conn,
                                 queue="feed",
                                 exchange_type='topic',
                                 exchange="collector",
                                 routing_key="collector.*.*")

    def run(self):
        self.consumer.register_callback(self._get_request_callback)
        print "Waiting..."
        self.consumer.wait()

    def _get_request_callback(self, message_data, message):
        #print "message_data=%s" % message_data
        drivers = []
        drivers.append(message_data)
        DRIVER_KEY = "driver_routing_key"
        TAGS_KEY = "tags"
        for obj in drivers:
            driver = None
            if DRIVER_KEY in obj and TAGS_KEY in obj:
                module_name = obj["driver_routing_key"]
                try:
                    __import__(module_name)
                    module = sys.modules[module_name]
                    driver = module.Driver()
                except:
                    print "could not import module %s" % module_name
                values = []
                for tag in obj['tags']:
                    if driver:
                        value = driver.read_value(tag['device'],
                                                  tag['address'])
                    else:
                        value = "BAD_DRIVER"
                    values.append({
                        'name': tag['name'],
                        'current_value': value,
                        'read_at': '2009-01-01'
                    })
                self.publisher.send(values)
            else:
                print "Badly formated request %s" % obj
        message.ack()

    class WorkerException(Exception):
        pass

    class ConnectionException(WorkerException):
        pass
Exemple #52
0
class SignalAMQP(Signal):
    def __init__(self, exchange, queue, routing_key=None, debug=None):
        """
			Initialise signal, conection, exchange, queue and run consumer 
			@return: Django Signal like object.

			@param exchange: name of exchange for this signal
			@type exchange: string

			@param queue: name queue of this signal
			@type queue: string

			@param routing_key: name of routing_key betwen exchange and queue of this signal
			@type routing_key: string

			@param debug: debug flag
			@type debug: bool

			Example:
			>>> amqp_signal_1 = SignalAMQP(exchange="test1", queue="q1")
			>>> amqp_signal_2 = SignalAMQP(exchange="test2", queue="q2")
			>>> amqp_signal_1.queue_bind(['q2'])
			>>> def amqp_handler(sender, **kwargs):
				print "AMPQ handler:", sender, kwargs
			>>> amqp_signal_2.connect(amqp_handler, sender=None)
			>>> amqp_signal_1.send("Hello world!")
		"""
        super(SignalAMQP, self).__init__(providing_args=["message"])

        self.exchange = exchange
        self.queue = queue
        self.routing_key = routing_key
        self.debug = debug is None and settings.DEBUG or debug

        self.conn = DjangoBrokerConnection()
        self.publisher = Publisher(connection=self.conn, exchange=self.exchange, exchange_type="fanout",\
             routing_key=self.routing_key)
        self.consumer = Consumer(connection=self.conn, queue=self.queue, exchange_type="fanout",\
           exchange=self.exchange, routing_key=self.routing_key)
        self.consumer.register_callback(self.callback)

        self.cl = self.listen()

    def send(self, message, **kw):
        """ Transfer message to bus. Message can be any simple python type. """
        self.publisher.send(message, **kw)

    def callback(self, message_data, message):
        """ Consumer callback function. Send Django singnal."""
        try:
            sender = message_data['sender']
        except:
            sender = None
        super(SignalAMQP, self).send(sender=sender,
                                     message_data=message_data,
                                     message=message)
        message.ack()
        if self.debug:
            print "AMPQ CALLBACK: sender=", sender, "messege=", message_data, message
        return True

    def get_backend(self):
        return self.conn.get_backend_cls()(DjangoBrokerConnection())

    def queue_bind(self, queue_list):
        """ Bind another queues to current exchange """
        routing_keys = []
        backend = self.get_backend()
        for x in queue_list:
            backend.queue_bind(queue=x, exchange=self.exchange, \
               routing_key='%s_%s' % (self.exchange, x))
            routing_keys.append('%s_%s' % (self.exchange, x))
        return routing_keys

    def listen(self):
        """ Run consumer loop thread """
        cl = ConsumerLoop()
        cl.consumer = self.consumer
        cl.start()
        return cl

    def stop(self):
        """ Unactivate this signal """
        self.conn.close()
Exemple #53
0
#!/usr/bin/env python
# coding=utf-8
from socket import socket, AF_INET, SOCK_DGRAM
from fstlib import easyip
from carrot.messaging import Publisher
from carrot.connection import BrokerConnection

conn = BrokerConnection(hostname='localhost',
                        port=5672,
                        userid='test',
                        password='******',
                        virtual_host='test')

publisher = Publisher(connection=conn,
                      exchange="fst",
                      exchange_type='topic',
                      routing_key="easyip.incomming",
                      serializer="json")

# Set the socket parameters
host = "localhost"
port = 1000 + easyip.EASYIP_PORT
buf = 1024
addr = (host, port)

# Create socket and bind to address
UDPSock = socket(AF_INET, SOCK_DGRAM)
UDPSock.bind(addr)

print "waiting"