1

「プラグイン」(python モジュール) を imp でロードし、後で APScheduler で実行するようにスケジュールできるプラグインベースのアプリケーションを構築しました。それらを正常に統合できましたが、クラッシュやアプリケーションの再起動に備えて永続性を実装したいと考えています。ということで、デフォルトのメモリ ジョブ ストアを SqlAlchemyJobStore に変更しました。このプログラムを初めて実行するときは、非常にうまく機能します。タスクはロードされ、スケジュールされ、データベースに保存され、適切なタイミングで実行されます。

問題は、アプリケーションを再度ロードしようとすると、次のトレースバックが表示されることです。

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

したがって、関数を再度インポートしようとすると問題があることは明らかです

これが私のスケジューラの初期化です:

    executors = {'default': ThreadPoolExecutor(5)}
    jobstores = {'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')}
    self.scheduler = BackgroundScheduler(executors = executors,jobstores=jobstores)

ロードする必要がある「プラグイン」といくつかのパラメータを含む「tests」ディクショナリがあります。「load_plugin」は、imp を使用してその名前でプラグインをロードします。

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)

ジョブの再構成をどのように処理できるかについて何か考えはありますか?

4

1 に答える 1

2

モジュール名の自動検出に問題があります。何を言うのは難しいですが、別の方法は、適切な検索パスを文字列として手動で与えることです (例: "package.module:function")。これができれば、この問題を回避できます。

于 2015-10-10T21:01:32.233 に答える