""" YouTube Ownership API Daemon ============================ SQS queue consumer daemon, that will send ownership update requests to YouTube. Clients will queue ownership update requests to Amazon SQS queue. Then the request will be picked up and executed by one of the request-processing worker threads, running within daemon process. """ import signal import sys from ytownership import config from ytownership.connectors import loggly from ytownership.connectors import mysql from ytownership.connectors.sentry import sentry_client from ytownership.errors import FailedToStartError from ytownership.logic.queue import QueueWorkerManager if __name__ == '__main__': current_app_logger = loggly.get_current_logger() try: with mysql.session_scope() as db_session: db_session.execute('SELECT 1') current_app_logger.info('Connected to MySQL.') except Exception as e: current_app_logger.critical('Failed to connect to MySQL: %s', e) sys.exit(1) manager = QueueWorkerManager( config.QUEUE_READER_THREADS, config.API_EXECUTOR_THREADS, config.YOUTUBE_SQS_QUEUE, config.PREFETCH_COUNT, config.SQS_MESSAGE_VISIBILITY_TIMEOUT, config.SQS_WAIT_TIME_SECONDS, config.SQS_NUM_MESSAGES, config.GOOGLE_API_KEY_FILE, current_app_logger ) manager.debug = config.DEBUG def signal_handler(signum, frame): current_app_logger.info('Stopping queue workers and exiting.') manager.stop(config.STOP_TIMEOUT) sys.exit(0) signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) try: manager.start() current_app_logger.info('App started.') while True: signal.pause() except FailedToStartError: if sentry_client: sentry_client.captureException() current_app_logger.critical('App failed to start. Exiting..') sys.exit(1)