"""
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)