python3 apscheduler 任务池 异常错误 /opt/www/taskPools1/venv/lib/python3.8/site-packages/apscheduler/jobstores/mongodb.py

发布时间 2023-08-08 12:08:19作者: IT树

报错信息:


(venv) root@VM-8-7-ubuntu:/opt/www/taskPools1# python main.py
Traceback (most recent call last):
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/apscheduler/jobstores/mongodb.py", line 86, in add_job
self.collection.insert_one({
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/pymongo/collection.py", line 639, in insert_one
self._insert_one(
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/pymongo/collection.py", line 579, in _insert_one
self.__database.client._retryable_write(acknowledged, _insert_command, session)
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1493, in _retryable_write
return self._retry_with_session(retryable, func, s, None)
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1360, in _retry_with_session
return self._retry_internal(retryable, func, session, bulk)
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/pymongo/_csot.py", line 106, in csot_wrapper
return func(self, *args, **kwargs)
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/pymongo/mongo_client.py", line 1401, in _retry_internal
return func(session, sock_info, retryable)
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/pymongo/collection.py", line 577, in _insert_command
_check_write_command_response(result)
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/pymongo/helpers.py", line 230, in _check_write_command_response
_raise_last_write_error(write_errors)
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/pymongo/helpers.py", line 202, in _raise_last_write_error
raise DuplicateKeyError(error.get("errmsg"), 11000, error)
pymongo.errors.DuplicateKeyError: E11000 duplicate key error collection: jxkServer.task_pools_jobs index: _id_ dup key: { _id: "test" }, full error: {'index': 0, 'code': 11000, 'errmsg': 'E11000 duplicate key error collection: jxkServer.task_pools_jobs index: _id_ dup key: { _id: "test" }', 'keyPattern': {'_id': 1}, 'keyValue': {'_id': 'test'}}

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "main.py", line 27, in <module>
scheduler.start()
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/flask_apscheduler/scheduler.py", line 105, in start
self._scheduler.start(paused=paused)
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/apscheduler/schedulers/gevent.py", line 21, in start
BaseScheduler.start(self, *args, **kwargs)
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/apscheduler/schedulers/base.py", line 167, in start
self._real_add_job(job, jobstore_alias, replace_existing)
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/apscheduler/schedulers/base.py", line 871, in _real_add_job
store.add_job(job)
File "/opt/www/taskPools1/venv/lib/python3.8/site-packages/apscheduler/jobstores/mongodb.py", line 92, in add_job
raise ConflictingIdError(job.id)
apscheduler.jobstores.base.ConflictingIdError: 'Job identifier (test) conflicts with an existing job'

 

报错原因:主要是 apscheduler  再将任务存储倒mongodb的时候是直接插入 并且任务id 就是任务名 导致 相同的任务插入错误

修改前:第84行的函数


def add_job(self, job):
try:
self.collection.insert_one({
'_id': job.id,
'next_run_time': datetime_to_utc_timestamp(job.next_run_time),
'job_state': Binary(pickle.dumps(job.__getstate__(), self.pickle_protocol))
})
except DuplicateKeyError:
raise ConflictingIdError(job.id)

修改以后:


def add_job(self, job):
try:
if not self.collection.find_one({'_id': job.id}):
self.collection.insert_one({
'_id': job.id,
'next_run_time': datetime_to_utc_timestamp(job.next_run_time),
'job_state': Binary(pickle.dumps(job.__getstate__(), self.pickle_protocol))
})
except DuplicateKeyError:
raise ConflictingIdError(job.id)