Example #1
0
class StompMessageProcessor(stomper.Engine):
	def __init__(self):
		super(StompMessageProcessor, self).__init__()
		self.username = getattr(settings, "RPC_USER", "pygowave_server")
		self.password = getattr(settings, "RPC_PASSWORD", "pygowave_server")
		self.pygo_mp = PyGoWaveClientMessageProcessor()
	
	def connect(self):
		"""Generate the STOMP connect command to get a session."""
		self.pygo_mp.logger.info("=> PyGoWave RPC Server starting <=")
		return stomper.connect(self.username, self.password)
	
	def connected(self, msg):
		"""Once I've connected I want to subscribe to my the message queue."""
		super(StompMessageProcessor, self).connected(msg)
		
		self.pygo_mp.logger.info("=> PyGoWave RPC Server ready <=")
		
		f = stomper.Frame()
		f.unpack(stomper.subscribe("wavelet_rpc_singlethread"))
		f.headers["exchange"] = "wavelet.topic"
		f.headers["routing_key"] = "#.#.clientop"
		f.headers["exchange_type"] = "topic"
		return f.pack()
	
	def ack(self, message):
		rkey = message["headers"]["destination"]
		self.pygo_mp.logger.info("Got "+message["body"])
		message_data = anyjson.deserialize(message["body"])
		
		msg_dict = self.pygo_mp.process(rkey, message_data)
		
		out_frames = ""
		for out_rkey, messages in msg_dict.iteritems():
			out_frames += self.send(out_rkey, messages)
		
		return super(StompMessageProcessor, self).ack(message) + out_frames

	def send(self, routing_key, message_data):
		"""Convert a routing_key and data dictionary into a STOMP message."""
		f = stomper.Frame()
		f.unpack(stomper.send(routing_key, anyjson.serialize(message_data)))
		f.headers["exchange"] = "wavelet.direct"
		f.headers["content-type"] = "application/json"
		return f.pack().encode("utf-8")
	
	def purge_connections(self):
		"""Forwards to PyGoWaveClientMessageProcessor"""
		self.pygo_mp.purge_connections()
Example #2
0
	def startFactory(self):
		self.pygo_mp = PyGoWaveClientMessageProcessor()
		self.pygo_mp.logger.info("=> PyGoWave RPC Server starting <=")
		self.lc = LoopingCall(self.pygo_mp.purge_connections)
		self.lc.start(10 * 60) # Purge every 10 minutes
		self.lc2 = LoopingCall(self.pygo_mp.log_stats)
		self.lc2.start(15 * 60, now=False) # Stats every 15 minutes
		self.pygo_mp.logger.info("=> PyGoWave RPC Server ready <=")
Example #3
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
Example #4
0
class StompServerFactory(ServerFactory):
	protocol = StompServerProtocol
	
	def __init__(self):
		self.subscriptions = {}
		self.destinations = {}
	
	def startFactory(self):
		self.pygo_mp = PyGoWaveClientMessageProcessor()
		self.pygo_mp.logger.info("=> PyGoWave RPC Server starting <=")
		self.lc = LoopingCall(self.pygo_mp.purge_connections)
		self.lc.start(10 * 60) # Purge every 10 minutes
		self.lc2 = LoopingCall(self.pygo_mp.log_stats)
		self.lc2.start(15 * 60, now=False) # Stats every 15 minutes
		self.pygo_mp.logger.info("=> PyGoWave RPC Server ready <=")
	
	def stopFactory(self):
		if self.lc.running:
			self.lc.stop()
	
	def subscribe(self, proto, name):
		self.subscriptions[proto.id].append(name)
		self.destinations[name] = proto
	
	def unsubscribe(self, proto, name):
		self.subscriptions[proto.id].remove(name)
		del self.destinations[name]
	
	def connected(self, proto):
		self.subscriptions[proto.id] = []
	
	def disconnected(self, proto):
		for sub in self.subscriptions[proto.id]:
			self.unsubscribe(proto, sub)
		del self.subscriptions[proto.id]
	
	def send(self, dest_name, body, headers={}):
		msg_dict = self.pygo_mp.process(dest_name, simplejson.loads(body.decode("utf-8")))
		
		for out_rkey, messages in msg_dict.iteritems():
			if self.destinations.has_key(out_rkey):
				self.destinations[out_rkey].sendFrame('MESSAGE', {'destination': str(out_rkey)}, simplejson.dumps(messages).encode("utf-8"))
	
	def __repr__(self):
		return "StompServerFactory"
Example #5
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
Example #6
0
	def __init__(self):
		super(StompMessageProcessor, self).__init__()
		self.username = getattr(settings, "RPC_USER", "pygowave_server")
		self.password = getattr(settings, "RPC_PASSWORD", "pygowave_server")
		self.pygo_mp = PyGoWaveClientMessageProcessor()