celery的worker遇到”Received unregistered task of type ‘tasks.add'”的错误

试玩了一下celery的priodic task,后来遇到了”Received unregistered task of type ‘tasks.add'”的错误,排查这个问题过程有点tricky,记录一下.
错误提示为:

这个错误信息提示的再明显不过了,一看就知道是什么问题. 但是在排查问题过程中,我思路比较僵化,一直认为时rabbitmq那边一直有消息没有被消费. 甚至后来还删除了RabbitMQ上的所有queue和message, 还重装了rabbitmq-server软件; 同时,还用一些工具去做Celery和RabbitMQ的monitoring. 也都没解决问题.

以为我本地没有再产生这样的新消息了啊,怎么rabbitmq中的消息一直都有呢?
后来的后来,我才发现,我本地的最开始配置priodic task的beat进程并没有完全推出,似乎我时用ctrl+c去结束掉主进程的,后来居然观察到其子进程并没有推出,还在继续运行,所以那个名为tasks.add的task还在按照10s的间隔运行,而我的worker代码中已经修改或删除了处理的task,所以worker并不能处理tasks.add这个任务,所以报了上面的错误.

另外, 最开始第一次出现这个错误的根本原因是,在使用priodic task时调用的是”tasks.add”,而celery worker这边可用的task其实是aew.tasks.add, 这个就时任务名称的配置问题. 可以用”celery -A aew inspect registered”命令(其中aew时我自己demo用的APP)去查看该APP中的所有注册了的task.

教训主要有两点:
1. 运行celery,进程退出后,要check一下子进程是否仍在运行.
2. 在配置priodic task时要确保task全名是在inspect registered中查到的注册了的任务, 要保持一致,否则worker无法执行这些任务.

参考资料:
http://stackoverflow.com/questions/9769496/celery-received-unregistered-task-of-type-run-example

master

Stay hungry, stay foolish.

发表评论

电子邮件地址不会被公开。 必填项已用*标注