system-prompts-and-models-o.../task/sqs_processor.py
2026-06-18 21:23:01 +05:30

92 lines
3.5 KiB
Python

import os
import json
import time
import boto3
import logging
from botocore.exceptions import ClientError
from lambda_function import lambda_handler
def read_sqs_messages():
"""Read messages from SQS queue"""
# Get queue URL from environment variable or use a default for testing
queue_url = os.environ.get('SQS_QUEUE_URL')
try:
# Create SQS client
sqs = boto3.client('sqs')
while True:
try:
# Receive message from SQS queue
response = sqs.receive_message(
QueueUrl=queue_url,
AttributeNames=['All'],
MaxNumberOfMessages=1,
MessageAttributeNames=['All'],
VisibilityTimeout=30,
WaitTimeSeconds=20
)
if 'Messages' in response:
messages = response['Messages']
print(f"Received {len(messages)} messages")
for message in messages:
receipt_handle = message['ReceiptHandle']
message_body = message['Body']
print("Message Body")
print(message_body)
try:
# Process the message with error handling
lambda_handler(message_body)
# Delete the message from the queue only if processing succeeded
sqs.delete_message(
QueueUrl=queue_url,
ReceiptHandle=receipt_handle
)
print(f"Successfully processed and deleted message: {receipt_handle}")
except (KeyError, json.JSONDecodeError, TypeError) as e:
# Log the error and skip this record
print(f"ERROR: Failed to process message due to data/parsing error: {e}")
print(f"Skipping problematic message: {message_body[:500]}") # Log first 500 chars
# Delete the problematic message to prevent infinite retries
sqs.delete_message(
QueueUrl=queue_url,
ReceiptHandle=receipt_handle
)
print(f"Deleted problematic message from queue to prevent pod restart")
except Exception as e:
# For other errors, log but don't delete - let SQS retry later
print(f"ERROR: Unexpected error processing message: {e}")
print(f"Message will be retried after visibility timeout")
# Don't delete the message, let it become visible again for retry
else:
print("No messages available in the queue")
except ClientError as e:
print(f"Error processing SQS messages: {e}")
time.sleep(5) # Wait before retrying
except Exception as e:
print(f"Fatal error: {e}")
raise
if __name__ == "__main__":
print("SQS message reader starting")
try:
read_sqs_messages()
except KeyboardInterrupt:
print("SQS message reader stopped by user")
except Exception as e:
print(f"SQS reader failed with error: {e}")