使用django_apscheduler执行定时任务,由于wait_timeout设置问题或其他原因导致到达指定执行时间时,任务未执行,django_apscheduler_djangojob表中,任务数据仍然存在,同时报错
ERROR
此错误信息无法被listener获取到,个人认为问题出现在mysql断掉了与django的连接,而django_apscheduler的调度器仍然使用这条连接访问数据库导致出错。
解决办法:
1.修改mysql中wait_timeout数值,具体修改办法百度可查,但是修改waittimeout并不能从根本上解决这个问题,在某种特定情况时,mysql同样会主动断掉连接,django_apscheduler有可能会出现上述问题。
2.修改django_apscheduler内部代码, 查找到以下文件:
![46289d33c28f094cec198990f1e7fce7.png](https://img-blog.csdnimg.cn/img_convert/46289d33c28f094cec198990f1e7fce7.png)
class DjangoJobManager(models.Manager):
"""
This manager pings database each request after 30s IDLE to prevent MysqlGoneAway error
"""
_last_ping = 0
_ping_interval = 30
def get_queryset(self):
self.__ping()
return super(DjangoJobManager, self).get_queryset()
def __ping(self):
# if time.time() - self._last_ping < self._ping_interval:
# return
try:
with connection.cursor() as c:
c.execute("SELECT 1")
except Exception as e:
self.__reconnect()
self._last_ping = time.time()
注释_ping函数中 时间判断逻辑,这段代码目的是每隔30秒判断一次数据库连接是否正常,不正常则关闭重连,注释后有可能会影响一定效率(未测试),使django_apscheduler每次请求数据库之前都判断一次连接。