python rabbitmq 消息重试机制_Rabbitmq多个消费者接收相同的消息,而不是循环

我正在尝试使用rabbitmq延迟消息交换插件,它似乎可以很好地发送延迟消息,该消息将在延迟间隔后接收。在消费消息时,我应该实现rabbitmq tutorial 2中常见的循环方法,但我收到的是多个消费者在消费同一条消息。客户机功能就是我要做的基本消费. 它的代码与教程2中关于循环调度和延迟插件的代码大致相同。在

代码的工作原理是这样的—接收函数接收一条消息,该消息具有特定的延迟,将被发送回队列中供以后使用。

发送消息以延迟方式发送消息。在

我面临的问题是基本消费因为一些错误的配置,我想我会让多个消费者消费同一条消息。在

有什么我需要改变,以实现多个消费者避免处理相同的请求。在class cities:

def __init__(self):

self.connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))

self.channel = self.connection.channel()

self.channel.exchange_declare("test-x", type="x-delayed-message", arguments={"x-delayed-type":"direct"})

self.channel.queue_declare(queue='towns_queue')

self.channel.queue_bind(queue="towns_queue", exchange="test-x", routing_key="towns_queue")

self.logger = logging.getLogger("rabbitmq")

self.logger.setLevel(logging.DEBUG)

handler = RotatingFileHandler("logs/Receive.log", maxBytes=100*1024*1024, backupCount=100)

self.logger.addHandler(handler)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

handler.setFormatter(formatter)

self.errlogger = logging.getLogger("Msg_timer_Error")

self.errlogger.setLevel(logging.ERROR)

errhandler = RotatingFileHandler("logs/towns_error.log", maxBytes=100*1024*1024, backupCount=100)

self.errlogger.addHandler(errhandler)

errformatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

errhandler.setFormatter(errformatter)

def call_api(self,url):

do something

def server_log(self,msg,value):

self.logger.info(msg+" : "+str(value))

def send_msg(self,msg,delay):

try:

delay = delay - 40

self.server_log("Delay Set : ",delay)

delay *=1000

self.channel.basic_publish(exchange='test-x',routing_key='towns_queue',body=msg,properties=pika.BasicProperties(headers={"x-delay"\

:delay},delivery_mode=1))

self.server_log("Msg Sent",msg)

except:

self.errlogger.exception(msg)

self.errlogger.exception(str(traceback.print_exc()))

pass

def receive(self,ch, method, properties, body):

try:

self.server_log("Received message : ",body)

self.process(body)

time.sleep(1)

ch.basic_ack(delivery_tag = method.delivery_tag)

return body

except:

self.errlogger.exception(body)

self.errlogger.exception(str(traceback.print_exc()))

pass

def process(self,body):

delay=self.call_api(body)

if delay:

self.send_msg(body,delay)

def client(self):

try:

self.channel.basic_qos(prefetch_count=1)

self.channel.basic_consume(self.receive,queue='towns_queue',no_ack=False)

self.channel.start_consuming()

except:

self.errlogger.exception(str(traceback.print_exc()))

pass

def close(self):

try:

self.connection.close()

except:

self.errlogger.exception(str(traceback.print_exc()))

pass

def multiprocess(num_process=4):

procs = []

objs = []

for i in range(4):

p = multiprocessing.Process(target=cities().client)

p.start()

procs.append(p)

for p in procs:

p.join()

if __name__ == "__main__":

if len(sys.argv)> 1:

num_proc = sys.argv[1]

if num_proc.isdigit():

num_proc = int(num_proc)

multiprocess(num_proc)

else:

raise Exception ('num_of_processes needs to be an integer.')

else:

multiprocess()

感谢任何帮助。在

更新:

这是否有问题:

^{pr2}$

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值