odoo與celery集成使用


一、簡介

Celery 通過消息機制進行通信,通常使用中間人(Broker)作為客戶端和職程(Worker)調節。

啟動一個任務,客戶端向消息隊列發送一條消息,然后中間人(Broker)將消息傳遞給一個職程(Worker),最后由職程(Worker)進行執行中間人(Broker)分配的任務。

二、中間人(Broker)

1。windows中使用

本次使用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

http://localhost:15672

默認用戶名密碼

guest guest

 

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都訪問

http://localhost:15672

默認用戶名密碼

guest guest

三、啟動celery

add_task.py

from tasks import add
result = add.apply_async(args=[10,20],countdown=0)
print result.id

task.py

from celery import Celery
import time

cel= Celery('tasks',broker='amqp://guest@127.0.0.1:5672//')

@cel.task
def add(x, y):
  time.sleep(1)
  return x + y

然后使用

celery -A task worker --loglevel=info 在終端中啟動

可以在rbbitmq的web界面看到通道和隊列信息

四、與odoo集成使用

先配置celery

celery_config.py

CELERY_IMPORTS = ('odoo_celery.pxy',)

pxy.py

#! /usr/bin/env python2
# encoding=utf-8
import sys
import time

reload(sys) sys.setdefaultencoding(
'utf8') import os from os import path q=path.dirname(__file__) ScriptPath = os.path.split( os.path.realpath( __file__ ) )[0] parent_path = os.path.dirname(ScriptPath) sys.path.append(parent_path) from celery import Celery import odoo_celery cel= Celery('grade',broker='amqp://guest@127.0.0.1:5672//') cel.config_from_object('odoo_celery.celery_config') @cel.task def add(x,b,c): time.sleep(1) print x+b+c

 

 

在odoo中

models.py

# -*- coding: utf-8 -*-

from odoo import models, fields, api

import random
import os
import sys
from os import path
d = path.dirname(__file__)
parent_path = os.path.dirname(os.path.dirname(d))
sys.path.append(parent_path)
from odoo_celery import pxy
class Course(models.Model):
    # 課程
    _name = 'grade.course'

    name = fields.Char(string=u'課程名',required=True,index=True)
    description=fields.Text(u"描述")
    responsible_teacher_id = fields.Many2one('grade.teacher', string=u"授課老師",ondelete='set null',domain="[('sex','=','woman'),('age','>',10)]")
    student_num = fields.Integer(string=u"班級人數")
    period_ids = fields.One2many('grade.period','course_id',string=u"課時")
    student_ids = fields.Many2many('grade.student',string=u"報名學生")

    @api.model
    def create(self, vals):
        record = super(Course, self).create(vals)
        result = pxy.add.delay(1,2,3)
        print result.id
        print self.name
        # print '----------------------------------------------'
        # result = add.delay(4, 4)
        # print result
        # print '----------------------------------------------'
        return record

 

啟動odoo

啟動celery 

celery -A pxy worker --loglevel=info


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM