class RabbitMQ_Queue(object):
    def _start_new_connect(self):
        self.conn=Connection(self.Queue_Server,username=self.Queue_User,password=self.Queue_PassWord
            ,vhost=self.Queue_Path,port=self.Queue_Port, io_loop=tornado.ioloop.IOLoop.instance())
        self.conn.on_disconnect=self.on_queue_disconnect
        self.conn.on_error=self.on_queue_error
        self.conn.connect(self.on_connect)
    def __init__(self,Queue_Server,Queue_User,Queue_PassWord,Queue_Path,BackQueueName,Queue_Port=None):
        self.Queue_Server=Queue_Server
        self.Queue_User=Queue_User
        self.Queue_PassWord=Queue_PassWord
        self.Queue_Path=Queue_Path
        self.Queue_Port=Queue_Port
        self.back_queue="WSBack-"+BackQueueName
        self._start_new_connect()
    def on_connect(self):
        if self.conn.status!=status.OPENED:
            print 'connect rabbitmq fail'
            self.conn.close(self.stop)
        else:
            print 'connect rabbitmq success'
            self.channel = self.conn.channel()
            self.channel.queue_declare('task', durable=True,
                             callback=self.on_queue_creation)
            self.channel.queue_declare(self.back_queue,auto_delete=True,callback=self.on_queue_back_created,durable=False)
    def on_queue_creation(self,qinfo):
        print "queue %s created"%qinfo.queue
        self.task_queue=qinfo.queue
    def on_queue_back_created(self,qinfo):
        print "back queue %s created"%qinfo.queue
        self.back_queue=qinfo.queue
        consumer = Consumer(self.consume_callback)
        self.channel.consume(qinfo.queue, consumer, no_ack=True)
    def consume_callback(self,msg):
        connid=msg.headers.get("connid",None)
        if connid:
            conn=connection_list.get(connid,None)
            if conn:
                if int(msg.headers.get("close_connect",0)):
                    connection_list.pop(conn.connid,'')
                    conn.close()
                    conn.on_close()
                    return
                retbody=msg.body
                compressed=msg.headers.get('compression')=='application/x-gzip'
                if compressed and not conn.usezlib:
                    retbody=zlib.decompress(retbody)
                elif not compressed and conn.usezlib:
                    retbody=zlib.compress(retbody)
                conn.write_message(retbody,binary=conn.usezlib)
                conn.last_act_time=time.time()
    def on_queue_disconnect(self):
        time.sleep(5)
        self._start_new_connect()
    def on_queue_error(self,err):
        print str(err)
        time.sleep(5)
        self._start_new_connect()
    def publish(self,msg):
        self.channel.publish(msg,'',self.task_queue)
class RabbitMQ_Queue(object):
    def _start_new_connect(self):
        self.conn=Connection(self.Queue_Server,username=self.Queue_User,password=self.Queue_PassWord
            ,vhost=self.Queue_Path,port=self.Queue_Port, io_loop=tornado.ioloop.IOLoop.instance())
        self.conn.on_disconnect=self.on_queue_disconnect
        self.conn.on_error=self.on_queue_error
        self.conn.connect(self.on_connect)
    def __init__(self,Queue_Server,Queue_User,Queue_PassWord,Queue_Path,BackQueueName,Queue_Port=None):
        self.Queue_Server=Queue_Server
        self.Queue_User=Queue_User
        self.Queue_PassWord=Queue_PassWord
        self.Queue_Path=Queue_Path
        self.Queue_Port=Queue_Port
        self._start_new_connect()
    def on_connect(self):
        if self.conn.status!=status.OPENED:
            print 'connect rabbitmq fail'
            self.conn.close(self.stop)
        else:
            print 'connect rabbitmq success'
            self.channel = self.conn.channel()
            self.channel.queue_declare(auto_delete=True,callback=self.on_queue_back_created,durable=False)
    def on_queue_back_created(self,qinfo):
        print "back queue %s created"%qinfo.queue
        self.back_queue=qinfo.queue
        self.channel.queue_bind(self.back_queue,"sys.sms",routing_key='sms.code',callback=self.on_queue_binded)
        consumer = Consumer(self.consume_callback)
        self.channel.consume(self.back_queue, consumer, no_ack=True)
    def on_queue_binded(self):
        print "queue binded"

    def consume_callback(self,msg):
        compressed=msg.headers.get('compression')=='application/x-gzip'
        if compressed:
            retbody=zlib.decompress(msg.body)
        else:
            retbody=msg.body
        global phone_pre
        js_data=json.loads(retbody)
        #if js_data['phone'][0:3] in phone_pre:
        if True:
            global connection_client
            if connection_client:
                connection_client.write_message(retbody)
    def on_queue_disconnect(self):
        time.sleep(5)
        self._start_new_connect()
    def on_queue_error(self,err):
        time.sleep(5)
        self._start_new_connect()
    def publish(self,msg):
        self.channel.publish(msg,'',self.task_queue)
class RabbitMQ_Queue(object):
    def _start_new_connect(self):
        self.conn = Connection(self.Queue_Server,
                               username=self.Queue_User,
                               password=self.Queue_PassWord,
                               vhost=self.Queue_Path,
                               port=self.Queue_Port,
                               io_loop=tornado.ioloop.IOLoop.instance())
        self.conn.on_disconnect = self.on_queue_disconnect
        self.conn.on_error = self.on_queue_error
        self.conn.connect(self.on_connect)

    def __init__(self,
                 Queue_Server,
                 Queue_User,
                 Queue_PassWord,
                 Queue_Path,
                 BackQueueName,
                 Queue_Port=None):
        self.Queue_Server = Queue_Server
        self.Queue_User = Queue_User
        self.Queue_PassWord = Queue_PassWord
        self.Queue_Path = Queue_Path
        self.Queue_Port = Queue_Port
        self.back_queue = "WSBack-" + BackQueueName
        self._start_new_connect()

    def on_connect(self):
        if self.conn.status != status.OPENED:
            print 'connect rabbitmq fail'
            self.conn.close(self.stop)
        else:
            print 'connect rabbitmq success'
            self.channel = self.conn.channel()
            self.channel.queue_declare('task',
                                       durable=True,
                                       callback=self.on_queue_creation)
            self.channel.queue_declare(self.back_queue,
                                       auto_delete=True,
                                       callback=self.on_queue_back_created,
                                       durable=False)

    def on_queue_creation(self, qinfo):
        print "queue %s created" % qinfo.queue
        self.task_queue = qinfo.queue

    def on_queue_back_created(self, qinfo):
        print "back queue %s created" % qinfo.queue
        self.back_queue = qinfo.queue
        consumer = Consumer(self.consume_callback)
        self.channel.consume(qinfo.queue, consumer, no_ack=True)

    def consume_callback(self, msg):
        connid = msg.headers.get("connid", None)
        if connid:
            conn = connection_list.get(connid, None)
            if conn:
                if int(msg.headers.get("close_connect", 0)):
                    connection_list.pop(conn.connid, '')
                    conn.close()
                    conn.on_close()
                    return
                retbody = msg.body
                compressed = msg.headers.get(
                    'compression') == 'application/x-gzip'
                if compressed and not conn.usezlib:
                    retbody = zlib.decompress(retbody)
                elif not compressed and conn.usezlib:
                    retbody = zlib.compress(retbody)
                conn.write_message(retbody, binary=conn.usezlib)
                conn.last_act_time = time.time()

    def on_queue_disconnect(self):
        time.sleep(5)
        self._start_new_connect()

    def on_queue_error(self, err):
        print str(err)
        time.sleep(5)
        self._start_new_connect()

    def publish(self, msg):
        self.channel.publish(msg, '', self.task_queue)
class RabbitMQ_Queue(object):
    def _start_new_connect(self):
        self.conn=Connection(self.Queue_Server,username=self.Queue_User,password=self.Queue_PassWord
            ,vhost=self.Queue_Path,port=self.Queue_Port, io_loop=tornado.ioloop.IOLoop.instance())
        self.conn.on_disconnect=self.on_queue_disconnect
        self.conn.on_error=self.on_queue_error
        self.conn.connect(self.on_connect)
    def __init__(self,Queue_Server,Queue_User,Queue_PassWord,Queue_Path,BackQueueName,Queue_Port=None):
        self.Queue_Server=Queue_Server
        self.Queue_User=Queue_User
        self.Queue_PassWord=Queue_PassWord
        self.Queue_Path=Queue_Path
        self.Queue_Port=Queue_Port
        self.back_queue="WSBack-%s.resback"%BackQueueName
        self._start_new_connect()
    def on_connect(self):
        if self.conn.status!=status.OPENED:
            print 'connect rabbitmq fail'
            self.conn.close(self.stop)
        else:
            print 'connect rabbitmq success'
            self.channel = self.conn.channel()
            self.channel.qos(prefetch_count=1)
            self.channel.exchange_declare('front_end',type='topic',durable=True,callback=self.on_exchange_declare)

    def on_exchange_declare(self):
        self.channel.queue_declare(self.back_queue,auto_delete=True,callback=self.on_queue_back_created,durable=False)

        print "exchange %s created"%'front_end'
        #self.task_queue=qinfo.queue

        global start_notified
        if start_notified==False:
            start_notified=True
            msg=Message(body='{"func":"front_end_restart","parm":{}}',delivery_mode=2,reply_to=self.back_queue)
            self.publish(msg)

    def on_queue_back_created(self,qinfo):
        print "back queue %s created"%qinfo.queue
        self.back_queue=qinfo.queue
        self.channel.queue_bind(self.back_queue,'front_end',self.back_queue,self.on_backqueue_bind)
        consumer = Consumer(self.consume_callback)
        self.channel.consume(qinfo.queue, consumer, no_ack=True)
    def on_backqueue_bind(self):
        print "back queue %s bind"%self.back_queue
    def consume_callback(self,msg):
        connid=msg.headers.get("connid",None)
        if connid:
            connids=connid.split("$")
            for oneid in connids:
                conn=connection_list.get(oneid,None)
                if conn:
                    if int(msg.headers.get("close_connect",0)):
                        connection_list.pop(conn.connid,'')
                        conn.close()
                        conn.on_close()
                        continue
                    compressed=msg.headers.get('compression')=='application/x-gzip'
                    conn.SendData(msg.body,compressed)
    def on_queue_disconnect(self):
        time.sleep(5)
        self._start_new_connect()
    def on_queue_error(self,err):
        time.sleep(5)
        self._start_new_connect()
    def publish(self,msg):
        self.channel.publish(msg,'front_end','task.front')