|
@@ -170,8 +170,8 @@ class RabbitMQ:
|
|
|
# 清除缓存
|
|
|
self.__cache.pop(queue, None)
|
|
|
self.__cache.pop(binding_key, None)
|
|
|
- # 重新声明
|
|
|
- self.declare(queue, exchange, routing_key)
|
|
|
+ # 重新声明绑定
|
|
|
+ self.declare_bind(queue, exchange, routing_key)
|
|
|
except Exception as e:
|
|
|
raise
|
|
|
|
|
@@ -206,27 +206,58 @@ class RabbitMQ:
|
|
|
def _channel(self, channel: AmqpStormChannel):
|
|
|
self.__channel = channel
|
|
|
|
|
|
- def add(self, queue, data, exchange=None):
|
|
|
+ def add_batch(self, queue, datas, exchange='', routing_key=''):
|
|
|
"""
|
|
|
- 推送数据到rabbitmq消息队列
|
|
|
+ 批量发布消息
|
|
|
|
|
|
@param str queue: 队列名称
|
|
|
- @param data: 推送数据
|
|
|
+ @param datas: 消息内容
|
|
|
@param str exchange: 交换机名称
|
|
|
+ @param str routing_key: 路由键
|
|
|
"""
|
|
|
- data_lst = data if isinstance(data, list) else [data]
|
|
|
- for item in data_lst:
|
|
|
- data_bytes = tools.dumps_obj(item) # 对象序列化
|
|
|
- # RabbitMQ 的 delivery_mode 属性用于设置消息的持久性。它有两种取值:
|
|
|
- # delivery_mode=1:表示消息被标记为持久化,但是仍然可能在服务器重启之前丢失。
|
|
|
- # delivery_mode=2:表示消息被标记为持久化,并且会存储在磁盘上,确保消息不会丢失
|
|
|
- properties = dict(delivery_mode=2)
|
|
|
- self._channel.basic.publish(
|
|
|
- exchange=exchange or self._exchange,
|
|
|
- routing_key=queue,
|
|
|
- body=data_bytes,
|
|
|
- properties=properties
|
|
|
- )
|
|
|
+ data_lst = datas if isinstance(datas, list) else [datas]
|
|
|
+ for data in data_lst:
|
|
|
+ self.add(data, queue, exchange, routing_key)
|
|
|
+
|
|
|
+ def add(self, data, queue='', exchange='', routing_key=''):
|
|
|
+ """
|
|
|
+ 发布消息
|
|
|
+
|
|
|
+ @param str queue: 队列名称
|
|
|
+ @param data: 消息内容
|
|
|
+ @param exchange: 交换机名称
|
|
|
+ @param routing_key: 路由键
|
|
|
+ """
|
|
|
+ if not routing_key and not queue:
|
|
|
+ raise AttributeError('请设置 routing_key or queue')
|
|
|
+
|
|
|
+ # 不指定交换机发送消息,routing_key 表示消息队列名称
|
|
|
+ # 指定交换机发送消息,routing_key 表示路由键
|
|
|
+ if not exchange:
|
|
|
+ routing_key = queue
|
|
|
+
|
|
|
+ # RabbitMQ 的 delivery_mode 属性用于设置消息的持久性。它有两种取值:
|
|
|
+ # delivery_mode=1:表示消息被标记为持久化,但是仍然可能在服务器重启之前丢失。
|
|
|
+ # delivery_mode=2:表示消息被标记为持久化,并且会存储在磁盘上,确保消息不会丢失
|
|
|
+ properties = dict(delivery_mode=2)
|
|
|
+ body = tools.dumps_obj(data) # 对象序列化
|
|
|
+ self._channel.basic.publish(
|
|
|
+ body=body,
|
|
|
+ routing_key=routing_key,
|
|
|
+ exchange=exchange,
|
|
|
+ properties=properties
|
|
|
+ )
|
|
|
+
|
|
|
+ def add_dlx(self, exchange, routing_key, data):
|
|
|
+ """
|
|
|
+ 发布延时消息
|
|
|
+
|
|
|
+ @param data: 消息内容
|
|
|
+ @param exchange: 交换机名称
|
|
|
+ @param routing_key: 路由键
|
|
|
+ """
|
|
|
+ queue = routing_key
|
|
|
+ self.add(data, queue, exchange, routing_key)
|
|
|
|
|
|
def ack(self, delivery_tag=0, multiple=False):
|
|
|
"""
|
|
@@ -279,24 +310,24 @@ class RabbitMQ:
|
|
|
else:
|
|
|
raise why
|
|
|
|
|
|
- def declare(self, queue, exchange=None, routing_key=None):
|
|
|
+ def declare_bind(self, queue='', exchange='', routing_key=''):
|
|
|
"""
|
|
|
- 声明队列、交换机并将队列绑定到交换机
|
|
|
+ 声明队列和交换机,同时将队列绑定交换机
|
|
|
|
|
|
@param queue: 队列名称
|
|
|
@param exchange: 交换机名称
|
|
|
@param routing_key: 路由键
|
|
|
"""
|
|
|
- routing_key = routing_key or queue
|
|
|
- binding_key = (queue, exchange or self._exchange, routing_key)
|
|
|
+ exchange = exchange or self._exchange
|
|
|
+ binding_key = (queue, exchange, routing_key)
|
|
|
if queue in self.__cache and binding_key in self.__cache:
|
|
|
return self.__cache[queue]
|
|
|
|
|
|
- self.declare_exchange(exchange or self._exchange)
|
|
|
+ self.declare_exchange(exchange)
|
|
|
result = self.declare_queue(queue)
|
|
|
self.__cache[queue] = result
|
|
|
# 队列绑定一个交换机
|
|
|
- self._channel.queue.bind(queue, exchange or self._exchange, routing_key)
|
|
|
+ self._channel.queue.bind(queue, exchange, routing_key)
|
|
|
self.__cache[binding_key] = True
|
|
|
return result
|
|
|
|
|
@@ -339,24 +370,22 @@ class RabbitMQ:
|
|
|
@param to_str: 消息是否转成字符串
|
|
|
"""
|
|
|
message_lst = []
|
|
|
- # 设置预取上限数量
|
|
|
- self._channel.basic.qos(prefetch_count=limit)
|
|
|
|
|
|
def callback(message):
|
|
|
- body = message.body
|
|
|
- # 处理接收到的消息
|
|
|
- impl = tools.loads_obj(body)
|
|
|
+ body = tools.loads_obj(message.body) # 反序列化消息对象
|
|
|
delivery_tag = message.delivery_tag
|
|
|
if no_ack:
|
|
|
self._channel.basic.ack(delivery_tag)
|
|
|
delivery_tag = 0
|
|
|
|
|
|
if to_str:
|
|
|
- message_lst.append(str(RabbitMQMessage(delivery_tag, impl)))
|
|
|
+ message_lst.append(str(RabbitMQMessage(delivery_tag, body)))
|
|
|
else:
|
|
|
- message_lst.append(RabbitMQMessage(delivery_tag, impl))
|
|
|
+ message_lst.append(RabbitMQMessage(delivery_tag, body))
|
|
|
|
|
|
try:
|
|
|
+ # 设置预取上限数量
|
|
|
+ self._channel.basic.qos(prefetch_count=limit)
|
|
|
# 注册消费者并获取消费者标签
|
|
|
consumer_tag = self._channel.basic.consume(callback, queue=queue)
|
|
|
# 开始消费
|
|
@@ -415,6 +444,7 @@ class RabbitMQ:
|
|
|
|
|
|
def get_message_count(self, queue):
|
|
|
message = self._channel.queue.declare(queue, passive=True)
|
|
|
+ # message_count 消息统计是消息发布确认之后的数量,未确认消息无法统计
|
|
|
return message.get('message_count')
|
|
|
|
|
|
def get_mq_obj(self):
|