由於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.在多個執行緒 或程序 同時對乙個訊息佇...