Source code for harvester.app

"""
app.py
==========

Contains functionality related to running the application waiting on redis messages

"""

import json
import signal

from structlog import get_logger
from redis import Redis

from .harvester import main
from .model import HarvesterAppConfig

LOGGER = get_logger(__name__)
TIMEOUT = 5


[docs]class App: def __init__( self, config: HarvesterAppConfig, client: Redis, listen_queue: str, ) -> None: self.config = config self.listen_queue = listen_queue self.client = client self.shutdown = False signal.signal(signal.SIGINT, self.exit_gracefully) signal.signal(signal.SIGTERM, self.exit_gracefully)
[docs] def exit_gracefully(self, signum, frame): LOGGER.info("Received shut down signal...", signum=signum) self.shutdown = True
[docs] def run(self) -> None: """Run the harvester daemon, listening on a redis queue for harvest jobs. """ # initialize the queue client result = self.client.brpop(self.listen_queue, timeout=TIMEOUT) if result is not None: _, value = result harvester_name = json.loads(value)["name"] # start the harvesting try: main(self.config, harvester_name) except Exception as e: LOGGER.exception(e)