2017-03-21 4 views
3

* django-celery-beat 1.0.1이 정기적 인 작업 예약에 문제가 있으므로 celery 3.1.25를 사용합니다.Celery (Django 사용)에서 예약 된 주기적 작업의 다음 실행 시간 확인

최근 셀러 비트 (celerybeat) 문제로 인해 일정 기간 동안 일정한 간격으로 일정한 작업이 스케줄러에서 '잊어 버린 것'으로 보입니다. 간격을 every 5 seconds으로 변경하면 작업이 정상적으로 (5 초마다) 실행되고 last_run_at 속성이 업데이트됩니다. 이것은 셀러리 비트가 스케줄러에 어느 정도 응답하고 있음을 의미하지만, last_run_atPeriodicTask.objects.update(last_run_at=None)을 재설정하면 every day 간격의 태스크가 더 이상 실행되지 않습니다.

Celerybeat가 한 지점에서 충돌이 발생하여 손상된 것일 수 있으므로 문제가 지속되는지 확인하기 위해 새 virtualenv 및 데이터베이스를 만들었습니다. 다음주기를 검색하여 주기적 작업이 실행되었는지 여부를 알기 위해 하루를 기다릴 필요가 없는지 알고 싶습니다.

나는 또한 inspect <active/scheduled/reserved>을 사용해 보았지만 모두 empty을 반환했습니다. djcelery의 데이터베이스 스케줄러를 사용하여 주기적으로 작업하는 것이 정상입니까?

def schedule_data_collection(request, project): 
    if (request.method == 'POST'): 
     interval = request.POST.get('interval') 

     target_project = Project.objects.get(url_path=project)  
     interval_schedule = dict(every=json.loads(interval), period='days') 

     schedule, created = IntervalSchedule.objects.get_or_create(
      every=interval_schedule['every'], 
      period=interval_schedule['period'], 
     ) 

     task_name = '{} data collection'.format(target_project.name) 

     try: 
      task = PeriodicTask.objects.get(name=task_name) 
     except PeriodicTask.DoesNotExist: 
      task = PeriodicTask.objects.create(
       interval=schedule, 
       name=task_name, 
       task='myapp.tasks.collect_tool_data', 
       args=json.dumps([target_project.url_path]) 
      ) 
     else: 
      if task.interval != schedule: 
       task.interval = schedule 

      if task.enabled is False: 
       task.enabled = True 

      task.save() 

     return HttpResponse(task.interval) 
    else: 
     return HttpResponseForbidden() 
+0

백엔드에는 무엇이 있습니까? 데이터베이스에 등록해야합니다. – sdolan

+0

@sdolan 나는 RabbitMQ w/PostgreSQL을 사용하고 있습니다. 작업의 새 인스턴스를 추가 할 때마다 스케줄러가 자동으로 업데이트되지만 여전히 작업자가 실행하도록 트리거하지는 않습니다. – FatHippo

답변

-1

당신은 쉘에 가서 app.conf.CELERYBEAT_SCEDULE보고하여 스케줄러를 볼 수 있습니다

여기에 일정 작업 함수입니다.

celery -A myApp shell 
print(app.conf.CELERYBEAT_SCHEDULE) 

모든 주기적 작업이 표시되어야합니다.