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

posted @ 2019-12-17 13:24  Languid  阅读(1083)  评论(1编辑  收藏  举报