import logging from app import notification_queue from data.model.notification import increment_notification_failure_count, reset_number_of_failures_to_zero from endpoints.notificationmethod import NotificationMethod, InvalidNotificationMethodException from endpoints.notificationevent import NotificationEvent, InvalidNotificationEventException from workers.queueworker import QueueWorker, JobException from data import model from data.model import InvalidNotificationException logger = logging.getLogger(__name__) class NotificationWorker(QueueWorker): def process_queue_item(self, job_details): notification_uuid = job_details['notification_uuid'] try: notification = model.notification.get_enabled_notification(notification_uuid) except InvalidNotificationException: return event_name = notification.event.name method_name = notification.method.name try: event_handler = NotificationEvent.get_event(event_name) method_handler = NotificationMethod.get_method(method_name) except InvalidNotificationMethodException as ex: logger.exception('Cannot find notification method: %s', ex.message) raise JobException('Cannot find notification method: %s' % ex.message) except InvalidNotificationEventException as ex: logger.exception('Cannot find notification event: %s', ex.message) raise JobException('Cannot find notification event: %s' % ex.message) if event_handler.should_perform(job_details['event_data'], notification): try: method_handler.perform(notification, event_handler, job_details) reset_number_of_failures_to_zero(notification.id) except (JobException, KeyError) as exc: increment_notification_failure_count(notification.id) raise exc if __name__ == "__main__": worker = NotificationWorker(notification_queue, poll_period_seconds=10, reservation_seconds=30, retry_after_seconds=30) worker.start()