"""PDF generating API Daemon. ============================ SQS queue consumer daemon, that will send data for pdf generation. Managers will conditionaly send data required for pdf generation from Orchard admin interface 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 ddtrace import patch_all from ddtrace import tracer from daemonJwtHandler.logic.jwt_services import JwtServices from salessheets import config from salessheets.connectors import loggly from salessheets.connectors.sentry import sentry_capture_exception from salessheets.errors import FailedToStartError from salessheets.logic.queue import QueueWorkerManager patch_all() if __name__ == '__main__': current_app_logger = loggly.get_current_logger() manager = QueueWorkerManager( config.QUEUE_READER_THREADS, config.API_EXECUTOR_THREADS, config.SALESSHEETS_SQS_QUEUE, config.PREFETCH_COUNT, config.SQS_MESSAGE_VISIBILITY_TIMEOUT, config.SQS_WAIT_TIME_SECONDS, config.SQS_NUM_MESSAGES, current_app_logger ) manager.debug = config.DEBUG @tracer.wrap() def initiate_jwtcaching(): jwtInstance = JwtServices.getInstance() jwtInstance.enableCaching(config.APP_NAME) initiate_jwtcaching() def signal_handler(signum, frame): """Start or stop daemon depending on signal. Use this function for stopping daemon. """ current_app_logger.info('Stopping queue workers and exiting.') manager.stop(config.STOP_TIMEOUT) tracer._writer.flush_queue() 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_capture_exception: sentry_capture_exception() current_app_logger.critical('App failed to start. Exiting..') tracer._writer.flush_queue() sys.exit(1)