def main()

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