我有一个芹菜工作者,在Ubuntu 14.04服务器上运行,使用pyodbc和freetds驱动程序读取和写入MSSQL Server数据库。当SQL Server关闭时,该函数按预期失败,芹菜工作者开始尝试清理并为下一个任务做好准备。这时,工人打电话给django" connection.close()"方法。此方法似乎发送命令以回滚任何未完成的事务。由于服务器已关闭,因此抛出了芹菜工作者未捕获的异常。然后工作人员挂起,既不会释放任务也不会继续执行下一个任务。
我尝试覆盖函数的on_failure和after_return方法并在那里调用connection.close()(如其他答案中所指定的),但这并不起作用。我怀疑这是因为当我调用connection.close()时它有同样的问题,只是冒出异常,或者因为celery的清理代码在调用这两个方法之前运行。
有关如何在获得芹菜之前捕获此异常的任何想法,或者一起避免这一点?
以下是异常的堆栈跟踪:
追踪(最近一次呼叫最后一次):
文件" /usr/local/lib/python2.7/dist-packages/celery/app/trace.py",第283行,在trace_task中 state,retval,uuid,args,kwargs,None,
文件" /var/www/cortex/corespring/tasks.py",第13行,在after_return中 连接[' XXX&#39]。close()方法
文件" /usr/local/lib/python2.7/dist-packages/django/db/backends/ init .py",第317行,关闭 self.connection.close()
文件" /usr/local/lib/python2.7/dist-packages/pyodbc.py",第2642行,关闭 self.rollback()
文件" /usr/local/lib/python2.7/dist-packages/pyodbc.py" ;,第2565行,回滚 check_success(self,ret)
文件" /usr/local/lib/python2.7/dist-packages/pyodbc.py",第987行,在check_success中 ctrl_err(SQL_HANDLE_DBC,ODBC_obj.dbc_h,ret,ODBC_obj.ansi)
文件" /usr/local/lib/python2.7/dist-packages/pyodbc.py",第965行,在ctrl_err中 引发DatabaseError(state,err_text)
DatabaseError :( u' 08S01',u' [08S01] [FreeTDS] [SQL Server]写入服务器失败')