J'ai construit une application plugin où les "plugins" (modules python) peuvent être chargés par imp puis planifiés pour une exécution ultérieure par APScheduler, j'ai réussi à les intégrer mais je veux implémenter la persistance en cas de crash ou l'application réapparaît, donc j'ai changé le magasin de travail de la mémoire par défaut pour le SqlAlchemyJobStore, ça marche plutôt bien la première fois que vous exécutez le programme: les tâches sont chargées, planifiées, enregistrées dans la base de données et exécutées au bon moment.Comment intégrer APScheduler et Imp?
problème est lorsque je tente de charger l'application à nouveau je reçois ce retraçage:
ERROR:apscheduler.jobstores.default:Unable to restore job "d3e0f0068df54d15986e9b7b6757f665" -- removing it
Traceback (most recent call last):
File "/home/jesus/.local/lib/python2.7/site-packages/apscheduler/jobstores/sqlalchemy.py", line 126, in _get_jobs
jobs.append(self._reconstitute_job(row.job_state))
File "/home/jesus/.local/lib/python2.7/site-packages/apscheduler/jobstores/sqlalchemy.py", line 114, in _reconstitute_job
job.__setstate__(job_state)
File "/home/jesus/.local/lib/python2.7/site-packages/apscheduler/job.py", line 228, in __setstate__
self.func = ref_to_obj(self.func_ref)
File "/home/jesus/.local/lib/python2.7/site-packages/apscheduler/util.py", line 257, in ref_to_obj
raise LookupError('Error resolving reference %s: could not import module' % ref)
LookupError: Error resolving reference __init__:run: could not import module
Il est donc évident qu'il ya un problème lors d'une tentative d'importer à nouveau la fonction
Voici mon planificateur initialisation:
executors = {'default': ThreadPoolExecutor(5)}
jobstores = {'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')}
self.scheduler = BackgroundScheduler(executors = executors,jobstores=jobstores)
J'ai un « tests » dictionnaire contenant les « plugins » qui doivent être chargés et certains paramètres, « load_plugin » utilise diablotin pour charger une plugin par son nom.
for test,parameters in tests.items():
if test in pluggins:
module=load_plugin(pluggins[test])
self.jobs[test]=self.scheduler.add_job(module.run,"interval",seconds=parameters["interval"],name=test)
Une idée sur la façon dont je peux gérer les travaux de reconstitution?
cela a résolu mon problème en effet, mais ce n'était pas évident comment mettre en œuvre, pour l'exhaustivité je vais modifier votre réponse avec le code de travail. –
oui, c'est une erreur de module..je crée une fonction avec un rappel de nom dans app.py qui est passé à add_job ... ça marche bien ... mais quand je redémarre app ... il ne peut pas trouver le nom de la fonction .. .i signifie que j'ai vérifié l'API pendant le débogage ... il obtient toutes les méthodes d'app.py sous forme de dictionnaire mais pas de rappel ... pourquoi? de l'aide ? –