当SQL Server数据库使用FreeTDS驱动程序崩溃时,Django-Celery工作程序挂起

时间:2015-02-11 19:04:47

标签: python sql-server django celery django-celery

我有一个芹菜工作者,在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]写入服务器失败')

0 个答案:

没有答案