# STEP 4 create Data Availability Schedule
    scheduleId = createScheduleExtration(listId, reportId)

    # STEP 5 determine Overall Average Arrival Time in UTC
    overallAverageArrivalUtc = getInstrumentTriggerDetail(scheduleId)

    done = False
    # STEP 6 schedule a background job to attempt data extraction at the arrival time.
    if overallAverageArrivalUtc is None:
        # All trigger's status is Arrived
        pollForExtraction(scheduleId)
        cleanUp()
    else:
        # Some triggers are not arrived
        scheduler = BackgroundScheduler()
        scheduler.timezone = pytz.utc
        scheduler.add_job(pollForExtraction,
                          'date',
                          run_date=overallAverageArrivalUtc,
                          args=[scheduleId])
        scheduler.start()

        try:
            # This is here to simulate application activity (which keeps the main thread alive).
            while (done == False):
                time.sleep(5)
            cleanUp()
        except (KeyboardInterrupt, SystemExit):
            # Not strictly necessary if daemonic mode is enabled but should be done if possible
            scheduler.shutdown()
            cleanUp()