1,消息推送类
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 import pika 2 3 4 # 同步消息推送类 5 class RabbitPublisher(object): 6 7 # 传入RabbitMQ的ip,用户名,密码,实例化一个管道 8 def __init__(self, host, user, password): 9 self.host = host 10 self.user = user 11 self.password = password 12 self.connection = pika.BlockingConnection(pika.ConnectionParameters(host=self.host, credentials=pika.PlainCredentials(self.user, self.password))) 13 self.channel = self.connection.channel() 14 15 # 发送消息在队列中 16 def send(self, queue_name, body): 17 self.channel.queue_declare(queue=queue_name, durable=True) # 声明一个持久化队列 18 self.channel.basic_publish(exchange='', 19 routing_key=queue_name, # 队列名字 20 body=body, # 消息内容 21 properties=pika.BasicProperties( 22 delivery_mode=2, # 消息持久化 23 )) 24 25 # 清除指定队列的所有的消息 26 def purge(self, queue_name): 27 self.channel.queue_purge(queue_name) 28 29 # 删除指定队列 30 def delete(self, queue_name, if_unused=False, if_empty=False): 31 self.channel.queue_delete(queue_name, if_unused=if_unused, if_empty=if_empty) 32 33 # 断开连接 34 def stop(self): 35 self.connection.close()
2.消息消费类
(1)同步消息消费
在同步消息消费的时候可能会出现pika库断开的情况,原因是因为pika客户端没有及时发送心跳,连接就被server端断开了。解决方案就是做一个心跳线程来维护连接。
心跳线程类
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 class Heartbeat(threading.Thread): 2 3 def __init__(self, connection): 4 super(Heartbeat, self).__init__() 5 self.lock = threading.Lock() # 线程锁 6 self.connection = connection # rabbit连接 7 self.quitflag = False # 退出标志 8 self.stopflag = True # 暂停标志 9 self.setDaemon(True) # 设置为守护线程,当消息处理完,自动清除 10 11 # 间隔10s发送心跳 12 def run(self): 13 while not self.quitflag: 14 time.sleep(10) # 睡10s发一次心跳 15 self.lock.acquire() # 加线程锁 16 if self.stopflag: 17 self.lock.release() 18 continue 19 try: 20 self.connection.process_data_events() # 一直等待服务段发来的消息 21 except Exception as e: 22 print "Error format: %s" % (str(e)) 23 self.lock.release() 24 return 25 self.lock.release() 26 27 #