2015-10-09 5 views
1

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?

Répondre

2

Quelque chose dans la détection automatique du nom du module se passe mal. Difficile de dire quoi, mais l'alternative est de lui donner manuellement le chemin de recherche approprié en tant que chaîne (par exemple "package.module: function"). Si vous pouvez le faire, vous pouvez éviter ce problème.

+0

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. –

+0

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 ? –