1. 程式人生 > 實用技巧 >關於Celery-4.4.7 Bug ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@localhost:5672//:

關於Celery-4.4.7 Bug ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@localhost:5672//:

一、問題:

使用命令後臺啟動Celery任務服務
celery multi start django_node -A django_celery_project -l info

發現無法載入celery.py,裡面的app例項,於是花了一天的時間百度上網查詢,最終解決不了該問題,自己開始動手看原始碼,
最終查出來,啟動celery multi start 會載入兩次app名字,第一次可以獲取app名字,第二次建立app的時候,發現app是None,導致celery服務啟動失敗,
並且是連結MQ是以主機:localhost 和 使用者名稱:Guest。

在base.py原始碼,函式:setup_app_from_commandline,增加列印引數,我們可以發現例項的變化,從
<Celery __main__ at 0x7f556f5400b8>[我們自己定義的 celery.py 裡面在app例項] ===> <Celery default at 0x7fd1c9aa9f60>[預設的例項]

[root@mq1 opt]# celery multi start node1 -A proj -l info
app=proj
app <Celery __main__ at 0x7f556f5400b8>
celery multi v4.4.7 (cliffs)
> Starting nodes...
app=None
app <Celery default at 0x7fd1c9aa9f60>


> node1@mq1: OK

從GitHub官方的Issues看到,有人反饋該問題,但是沒有具體的解決方法,解決方法也已經GitHub回答,地址:https://github.com/celery/celery/issues/6336 

二、報錯內容:

[2020-09-09 14:50:49,689: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@localhost:5672//:
 Couldn't log in: server connection error 403, message: ACCESS_REFUSED - Login was refused using authentication mechanism 
PLAIN. For details see the broker logfile..
Trying again in 6.00 seconds... (1/100)

三、解決方法

# 修改Celery原始碼解決
vi $PYTHON_HOME/lib/site-packages/celery/bin/base.py +476 ... def setup_app_from_commandline(self, argv): preload_options, remaining_options = self.parse_preload_options(argv) quiet = preload_options.get('quiet') if quiet is not None: self.quiet = quiet try: self.no_color = preload_options['no_color'] except KeyError: pass workdir = preload_options.get('workdir') if workdir: os.chdir(workdir) app = (preload_options.get('app') or os.environ.get('CELERY_APP') or self.app) # Add Code 增加程式碼部分 if app: os.environ['CELERY_APP']=app preload_loader = preload_options.get('loader') if preload_loader: # Default app takes loader from this env (Issue #1066). os.environ['CELERY_LOADER'] = preload_loader loader = (preload_loader, os.environ.get('CELERY_LOADER') or 'default') broker = preload_options.get('broker', None) ...

四、問題已解決,該問題只針對Celery-4.4.7版本,不排除後期版本更新,解決該Bug

五、驗證是否任務是否可以排程

5.1、啟動celery任務服務

5.2、啟動Django專案

六、任務處理接收都正常,問題完美解決。