in python/website-worker/research_pacs/website_worker/main.py [0:0]
def main():
logger.info('Starting website worker')
try:
global env
env = get_env()
# Create the clients
global client
client = rpacs_util.ClientList()
client.add('orthanc', OrthancClient(env.orthanc_host, env.orthanc_user, env.orthanc_pwd))
client.add('sqs', boto3.client('sqs', region_name=env.region))
# This will store the last time when `clean_database` was called
last_time_clean_database = None
# Exit if any of the previous steps failed
except Exception as e:
logger.fatal(f'Failed to initialize the program - {e}')
sys.exit(1)
# Loop until the program is interrupted
killer = rpacs_util.GracefulKiller()
while not killer.kill_now:
# Retrieve up to 10 messages from the SQS queue
try:
messages_returned = False
logger.debug(f'Retrieving messages from the SQS queue')
sqs_response = client.sqs.receive_message(
QueueUrl=env.queue_url,
AttributeNames=['ApproximateReceiveCount'],
MaxNumberOfMessages=10,
MessageAttributeNames=['All'],
VisibilityTimeout=env.queue_timeout,
WaitTimeSeconds=1
)
# Process each message and delete it from the queue if it succeeded
messages = sqs_response['Messages'] if 'Messages' in sqs_response else []
logger.debug(f'SQS returned {len(messages)} messages to process')
if len(messages) > 0:
messages_returned = True
for message in messages:
try:
# Delete the message if it was served more than `queue_max_attemps`
nb_attempts = int(message['Attributes']['ApproximateReceiveCount'])
if nb_attempts > env.queue_max_attemps:
client.sqs.delete_message(QueueUrl=env.queue_url, ReceiptHandle=message['ReceiptHandle'])
continue
process_message(message)
except Exception as e:
logger.error(f'Failed to process the message ({nb_attempts} attempts) - {e}')
except Exception as e:
logger.error(f'Failed to poll messages from SQS - {e}')
# Clean the database every 60 seconds
if last_time_clean_database is None or (datetime.now() - last_time_clean_database).seconds > 60:
clean_database()
last_time_clean_database = datetime.now()
# Wait 5 seconds if the previous request returned no SQS message
if messages_returned is False:
logger.debug(f"Waiting 5 seconds")
killer.sleep(5)
# Before the program exits
logger.info('Stopping website worker')