import redis
import logging
import os
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
class MessageQueueComponents:
def __init__(self, redis_host='localhost', redis_port=6379):
"""
Initializes components for message queue diagnostics with fallback logic.
"""
self.redis = self._create_redis_connection(redis_host, redis_port)
self.logger = logging.getLogger(__name__)
def _create_redis_connection(self, host, port):
"""
Creates a Redis connection with fallback.
"""
try:
redis_conn = redis.Redis(host=host, port=port, db=0)
redis_conn.ping() # Test connection
self.logger.info("Successfully connected to Redis.")
return redis_conn
except redis.exceptions.ConnectionError as e:
self.logger.error(f"Failed to connect to Redis at {host}:{port}. Attempting fallback...")
# Attempt to connect with default values
try:
redis_conn = redis.Redis(host='localhost', port=6379, db=0)
redis_conn.ping()
self.logger.info("Successfully connected to Redis using default settings after fallback.")
return redis_conn
except redis.exceptions.ConnectionError as fallback_e:
self.logger.error(f"Failed to connect to Redis even with default settings. Using mock object.")
return MockRedis() # Return a mock object if all fails
def get(self, key):
"""
Retrieves a value from the queue. Uses redis.
"""
try:
return self.redis.get(key)
except Exception as e:
self.logger.error(f"Error getting from Redis: {e}")
return None
def set(self, key, value):
"""
Sets a value in the queue. Uses redis.
"""
try:
self.redis.set(key, value)
except Exception as e:
self.logger.error(f"Error setting in Redis: {e}")
def delete(self, key):
"""
Deletes a key from the queue. Uses redis.
"""
try:
self.redis.delete(key)
except Exception as e:
self.logger.error(f"Error deleting from Redis: {e}")
class MockRedis:
"""
A mock Redis object for testing and fallback scenarios.
"""
def __init__(self):
self.data = {}
def get(self, key):
return self.data.get(key)
def set(self, key, value):
self.data[key] = value
def delete(self, key):
if key in self.data:
del self.data[key]
Add your comment