python訊息佇列的使用

2021-09-09 06:54:22 字數 2781 閱讀 9474

由於erp系統需要跟倉庫之前使用的庫存統計資料一致,所以需要出入庫單據同步。本來是想在資料庫上建立乙個觸發器,只要有新增記錄,便通過介面傳入另一方。但是這樣做的弊端就是,當伺服器拓機時正有資料進行傳輸,那麼這個時間段的資料,將獲取不到。

所以啟用了訊息佇列,即便伺服器拓機,沒有處理的資料仍會得到保留。

使用的是rabbitmq  安裝的過程就不累述了,網上有很多教程。

利用訊息佇列去實現推送和獲取內容,作為生產者,我們要將所要傳輸的資料,進行組裝,然後放到我們約定好的佇列當中,等待消費者去獲取。

move_data = 

line = dict()

line['erp_sell_order_num'] = sd.order_id.name

line['erp_wh_code'] = sd.order_id.shipping_rule_id.warehouse_supplier.code

line['erp_company_code'] = sd.company_id.id

line['type'] = 'return'

item_list =

for icon in sd.line_out_ids:

item = dict()

item['sku'] = icon.goods_id.name

item['qty'] = icon.goods_qty

item['unit_cost_price'] = icon.cost_unit

item['cost_price'] = icon.goods_qty * icon.cost_unit

item['erp_sell_order_id'] = sd.order_id.id

line['erpsellorderitems'] = item_list

if move_data:

credentials = pika.plaincredentials('user', 'password')

connection = pika.blockingconnection(

pika.connectionparameters('xx.xx.xx.xx', 5672, '/', credentials))

channel = connection.channel()

channel.queue_declare(queue='erpsellerorder')

channel.basic_publish(exchange='',

routing_key='erpsellerorder',

body=json.dumps(move_data))

print u"推送訊息佇列"

connection.close()

作為消費者,我們從佇列之中獲取資料,那麼我們在處理完資料之後,需要回傳給訊息佇列乙個訊息,說明這次資料我收到了,那麼訊息佇列便會把這一次的資料給清除掉,不然的話,這次的資料將一直像你推送。

def callback(ch, method, properties, body):

if body:

db = 'demo'

username = 'admin'

password = 'admin'

odoo = odoorpc.odoo('127.0.0.1', port=5432)

odoo.login(db, username, password)

data = json.loads(body)

datas = dict()

datas['u82erplist'] = data

# datas = urllib.urlencode(datas)

reponse = odoo.json(url='warehouse/inventory/in', params = datas)

if 'result' in reponse:

demo = json.loads(reponse['result'])

if demo['status'] == u'success':

print u'佇列結束'

ch.basic_ack(delivery_tag=method.delivery_tag)

else:

ch.basic_ack(delivery_tag=method.delivery_tag)

def the_demo_list():

credentials = pika.plaincredentials('user', 'password')

connection = pika.blockingconnection(pika.connectionparameters('xx.xx.xx.xx', 5672, '/', credentials))

channel = connection.channel()

channel.queue_declare(queue='u8rdrecord')

channel.basic_consume(callback, queue='u8rdrecord',no_ack=false) #no_ack=false是需要回傳訊息的,true的話,訊息佇列發完之後便會刪除。

print u'開始監聽訊息佇列'

channel.start_consuming()

if platform.platform().find('windows')==-1:

print u'啟動訊息佇列'

t = threading.thread(target=the_demo_list)

t.start()

目前用到的暫時這麼多,後期學到更多的,我再來補充。

Python使用redis的訊息佇列

redis 服務 1 安裝 yum install redis 2 python安裝支援模組 opt python2.7.13 bin pip install redis 3 和redis的簡單直接互動 in 1 import redis in 2 rc redis.redis host 192.1...

Python使用redis的訊息佇列

redis 服務 1 安裝 yum install redis 2 python安裝支援模組 opt python2.7.13 bin pip install redis 3 和redis的簡單直接互動 in 1 import redis in 2 rc redis.redis host 192.1...

訊息佇列的使用

剛開始看的時候,由兩個疑問,我自己的答案是這樣的 1.訊息佇列在系統中的最大個數,關於這個問題,書上有明確的答案 書上有個 列明了linux free bsd,mac os x solaris中的典型值。當然也可以通過一些手段來修改。sysctl就可以修改。2.在多個執行緒 或程序 同時對乙個訊息佇...