使用JSON Serializer配置Celery(Python + node.js)

时间:2017-05-01 01:39:03

标签: python json node.js celery node-celery

我使用celery module v3.1.25 在Python中运行Celery工作程序,并在node.js中使用node-celery npm package v0.2.7运行Celery客户端(不是最新的)

使用Python Celery客户端发送作业时,Python Celery工作程序正常工作。

问题:当使用node-celery客户端向Celery后端发送任务时,我们在JS控制台中收到错误:

  

(STDERR)Celery应配置json序列化程序

Python Celery worker配置为:

app = Celery('tasks', 
    broker='amqp://test:test@192.168.1.26:5672//',
    backend='amqp://',
    task_serializer='json',
    include=['proj.tasks'])

node-celery客户端配置为:

var celery = require('node-celery')
var client = celery.createClient({
    CELERY_BROKER_URL: 'amqp://test:test@192.168.1.26:5672//',
    CELERY_RESULT_BACKEND: 'amqp',
    CELERY_TASK_SERIALIZER: "json"
});

client.on('connect', function() {
    console.log('connected');

    client.call('proj.tasks.getPriceEstimates', [start_latitude, start_longitude],
        function(result) {
            console.log('result: ', result);
            client.end();
        })
});

这是Python Celery工作者配置的问题吗?我们是否错过了可以将返回序列化格式更改为json的配置参数?

更新

根据ChillarAnand建议的result_serializersaccept_content参数进行了更新

from __future__ import absolute_import, unicode_literals
from celery import Celery

app = Celery('tasks', 
    broker='amqp://test:test@192.168.1.26:5672//',
    backend='amqp://',
    task_serializer='json',
    result_serializer='json',
    accept_content=['application/json'],
    include=['proj.tasks'])

但是node.js Celery客户端仍然认为它不在json中,抛出相同的错误消息。

由于results were in the form of 'application/x-python-serialize',它会产生错误。

检查是这种情况,因为RabbitMQ管理控制台显示结果为content_type: application/x-python-serialize

This forum post says that这是因为任务是在加载配置之前创建的。

以下是我的文件的样子:

凸出/ celery.py

from __future__ import absolute_import, unicode_literals
from celery import Celery

app = Celery('tasks', 
    broker='amqp://test:test@192.168.1.26:5672//',
    backend='amqp://',
    task_serializer='json',
    result_serializer='json',
    accept_content=['application/json'],
    include=['proj.tasks'])

凸出/ tasks.py

from __future__ import absolute_import, unicode_literals
from .celery import app

@app.task
def myTask():
    ...
    return ...

是否有更好的方法来构造代码以确保在任务之前加载配置?

1 个答案:

答案 0 :(得分:1)

配置序列化程序时,还应指定内容类型,任务序列化程序和结果序列化程序。

app = Celery(
    broker='amqp://guest@localhost//',
    backend='amqp://',
    include=['proj.tasks'],

    task_serializer='json',
    result_serializer='json',
    accept_content = ['application/json'],
)