试玩了一下celery的priodic task,后来遇到了"Received unregistered task of type 'tasks.add'"的错误,排查这个问题过程有点tricky,记录一下.
错误提示为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[2014-08-30 04:34:14,913: ERROR/MainProcess] Received unregistered task of type 'tasks.add'. The message has been ignored and discarded. Did you remember to import the module containing this task? Or maybe you are using relative imports? Please see http://bit.ly/gLye1c for more information. The full contents of the message body was: {'retries': 0, 'task': 'tasks.add', 'utc': False, 'args': (4, 4), 'expires': None, 'eta': None, 'kwargs': {}, 'id': '841bc21f-8124-436b-92f1-e3b62cafdfe7'} Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/celery/worker/consumer.py", line 444, in receive_message self.strategies[name](message, body, message.ack_log_error) KeyError: 'tasks.add' |
这个错误信息提示的再明显不过了,一看就知道是什么问题. 但是在排查问题过程中,我思路比较僵化,一直认为时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
One Comment