一、在windos中安裝配置rabbitmq
本次使用rabbitmq作為broker,不設后端backend
rabbitmq在4.0之后不支持windows使用,可以下載老版本的在本地windows使用。
http://erlang.org/download/otp_win64_17.3.exe 先下載安裝erlang語言
https://www.rabbitmq.com/download.html 再下載rabbitmq 我在本地下載的3.5.8版本
部分RabbitMQ版本可能與erlang語言版本不適配而導致不能使用
安裝好后默認的http訪問端口為15672
amqp端口為5672
默認用戶名密碼
guest guest
二、用docker啟動rabbitmq
2.在docker中啟動
docker run -d --hostname localhost --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq:3.6.15-management
啟動帶有web頁面的rabbitmq
-d 后台進程運行
hostname RabbitMQ主機名稱
name 容器名稱
-p port:port 本地端口:容器端口
-p 15672:15672 http訪問端口
-p 5672:5672 amqp訪問端口
http只能用宿主ip+端口進行訪問
ampq 可以用localhost和宿主ip都訪問
默認用戶名密碼
guest guest
三、使用RabbitMQ
receive.py
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import pika import time hostname = 'localhost' parameters = pika.ConnectionParameters(hostname) connection = pika.BlockingConnection(parameters) # 創建通道 channel = connection.channel() channel.queue_declare(queue='task_queue1',durable=True) def callback(ch, method, properties, body): print " [x] Received %r" % (body,) time.sleep(2) print " [x] Done" ch.basic_ack(delivery_tag=method.delivery_tag) # basic_qos設置prefetch_count=1,使得rabbitmq不會在同一時間給工作者分配多個任務, # 即只有工作者完成任務之后,才會再次接收到任務。 channel.basic_qos(prefetch_count=1) # 告訴rabbitmq使用callback來接收信息 channel.basic_consume('task_queue1', callback) # 開始接收信息,並進入阻塞狀態,隊列里有信息才會調用callback進行處理,按ctrl+c退出 print ' [*] Waiting for messages. To exit press CTRL+C' channel.start_consuming()
pycharm終端中啟動 python receive.py
send1.py
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import pika import random hostname = 'localhost' parameters = pika.ConnectionParameters(hostname) connection = pika.BlockingConnection(parameters) # 創建通道 channel = connection.channel() # 如果rabbitmq自身掛掉的話,那么任務會丟失。所以需要將任務持久化存儲起來,聲明持久化存儲: channel.queue_declare(queue='task_queue1', durable=True) number = random.randint(1, 1000) message = 'hello world:%s' % number # 在發送任務的時候,用delivery_mode=2來標記任務為持久化存儲: channel.basic_publish(exchange='', routing_key='task_queue1', body=message, properties=pika.BasicProperties( delivery_mode=2, )) print " [x] Sent %r" % (message,) connection.close()
send.py
#!/usr/bin/env python2 # -*- coding: utf-8 -*- import pika import random hostname = 'localhost' parameters = pika.ConnectionParameters(hostname) connection = pika.BlockingConnection(parameters) # 創建通道 channel = connection.channel() # 聲明hello隊列,生產者消費者在相同隊列 channel.queue_declare(queue='hello',durable=True) number = random.randint(1, 1000) body = 'hello world:%s' % number # 寫明發送隊列和指定隊列 channel.basic_publish(exchange='', routing_key='hello',body=body,properties=pika.BasicProperties(delivery_mode=2)) print "[x] sent %s" % body connection.close()
可以看到輪流接受傳收到的信息