A timer interface that uses APScheduler 3.0.
| 38 | |
| 39 | |
| 40 | class St2Timer(object): |
| 41 | """ |
| 42 | A timer interface that uses APScheduler 3.0. |
| 43 | """ |
| 44 | |
| 45 | def __init__(self, local_timezone=None): |
| 46 | self._timezone = local_timezone |
| 47 | self._scheduler = BlockingScheduler(timezone=self._timezone) |
| 48 | self._jobs = {} |
| 49 | self._trigger_types = list(TIMER_TRIGGER_TYPES.keys()) |
| 50 | self._trigger_watcher = TriggerWatcher( |
| 51 | create_handler=self._handle_create_trigger, |
| 52 | update_handler=self._handle_update_trigger, |
| 53 | delete_handler=self._handle_delete_trigger, |
| 54 | trigger_types=self._trigger_types, |
| 55 | queue_suffix=self.__class__.__name__, |
| 56 | exclusive=True, |
| 57 | ) |
| 58 | self._trigger_dispatcher = TriggerDispatcher(LOG) |
| 59 | |
| 60 | def start(self): |
| 61 | self._register_timer_trigger_types() |
| 62 | self._trigger_watcher.start() |
| 63 | self._scheduler.start() |
| 64 | |
| 65 | def cleanup(self): |
| 66 | self._scheduler.shutdown(wait=True) |
| 67 | |
| 68 | def add_trigger(self, trigger): |
| 69 | self._add_job_to_scheduler(trigger) |
| 70 | |
| 71 | def update_trigger(self, trigger): |
| 72 | self.remove_trigger(trigger) |
| 73 | self.add_trigger(trigger) |
| 74 | |
| 75 | def remove_trigger(self, trigger): |
| 76 | trigger_id = trigger["id"] |
| 77 | |
| 78 | try: |
| 79 | job_id = self._jobs[trigger_id] |
| 80 | except KeyError: |
| 81 | LOG.info("Job not found: %s", trigger_id) |
| 82 | return |
| 83 | |
| 84 | self._scheduler.remove_job(job_id) |
| 85 | del self._jobs[trigger_id] |
| 86 | |
| 87 | def _add_job_to_scheduler(self, trigger): |
| 88 | trigger_type_ref = trigger["type"] |
| 89 | trigger_type = TIMER_TRIGGER_TYPES[trigger_type_ref] |
| 90 | try: |
| 91 | util_schema.validate( |
| 92 | instance=trigger["parameters"], |
| 93 | schema=trigger_type["parameters_schema"], |
| 94 | cls=util_schema.CustomValidator, |
| 95 | use_default=True, |
| 96 | allow_default_none=True, |
| 97 | ) |
no outgoing calls