2015-09-25 2 views
3

Je suis nouveau sur APScheduler et je le teste avant de l'implémenter dans une plus grande portée.APScheduler - travail non exécuté

J'ai créé le code ci-dessous, mais mes fonctions ne sont jamais appelées quand j'utilise add_job avec trigger='date'. Si j'utilise trigger='interval', alors tout fonctionne bien.

J'ai aussi essayé de jouer avec run_date param, sans chance.

Une idée de ce qui pourrait être faux?

Apscheduler est une version 3.0.3

Un grand merci à l'avance :)

def my_listener(event): 
    if event.exception: 
     print('The job crashed :(') 
    else: 
     print('The job worked :)') 

def test(): 
    print("{} ok ".format(datetime.now())) 


def myFunc(content, img): 
    print("{} - content={}|image{}".format(datetime.now(), content, img)) 
    myfile = open("scheduler.log", "a") 
    myfile.write("{} - content={}|image{}".format(datetime.now(), content, img)) 
    myfile.close() 

def main(): 
    jobstores = \ 
     { 
      'default': SQLAlchemyJobStore(url="postgresql+psycopg2://{}:{}@{}:{}/{}".format(db_user, db_password, db_host, db_port, db_database)) 
     } 

    executors = \ 
     { 
      'default': ThreadPoolExecutor(20), 
      'processpool': ProcessPoolExecutor(5) 
     } 

    job_defaults = \ 
     { 
      'coalesce': False, 
      'max_instances': 3 
     } 

    scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc) 
    scheduler.start() 
    CURR_DATE = datetime.strptime(datetime.strftime(datetime.now(), '%Y%m%d%H%M'), '%Y%m%d%H%M') 
    JOB_DATE = CURR_DATE + timedelta(minutes=1) 
    uid=uuid.uuid4() 
    newjob = scheduler.add_job(myFunc, 
           trigger='date', 
           args=['content data', 'image data'], 
           kwargs=None, 
           id=str(uid), 
           name='test' + str(uid), 
           misfire_grace_time=5, 
           coalesce=False, 
           max_instances=1, 
           next_run_time= JOB_DATE, 
           jobstore='default', 
           executor='default', 
           replace_existing=True) 

    print("Added - {}".format(newjob)) 
    scheduler.add_listener(my_listener, events.EVENT_JOB_EXECUTED | events.EVENT_JOB_ERROR) 
    scheduler.print_jobs() 
    while True: 
     sys.stdout.write('{}\n'.format(datetime.now())); sys.stdout.flush() 
     sleep(1) 

if __name__ == "__main__": 
    main() 

Répondre

3

Le problème est que vous utilisez next_run_time = JOB_DATE, au lieu de run_date = JOB_DATE,

une autre l'option déclare votre déclencheur et le transmet comme paramètre pour ajouter un travail comme ceci:

trigger = DateTrigger(run_date=start_date) 
newjob = scheduler.add_job(myFunc, 
          trigger=trigger, 
          args=['content data', 'image data'], 
          kwargs=None, 
          id=str(uid), 
          name='test' + str(uid), 
          misfire_grace_time=5, 
          coalesce=False, 
          max_instances=1, 
          jobstore='default', 
          executor='default', 
          replace_existing=True) 

un autre problème avec votre code est que si vous avez fait votre planificateur timeaware vous utilisez un datetime pas au courant

CURR_DATE = datetime.strptime(datetime.strftime(datetime.now(), '%Y%m%d%H%M'), '%Y%m%d%H%M') 
JOB_DATE = CURR_DATE + timedelta(minutes=1) #this is unaware 

essayer de déclarer votre date de cette façon:

import pytz 
import datetime 

job_date = datetime.datetime.now(pytz.UTC) + datetime.timedelta(minutes=1)