<?php
/**
* Simple message queue retrier.
*
* This script assumes a simple message queue implementation where messages
* are stored in an array. It retries failed operations a specified
* number of times.
*
* @param array $queue An array representing the message queue. Each element
* is an associative array containing the message data and
* a 'attempts' key indicating the number of retry attempts.
* @param int $maxAttempts The maximum number of retry attempts allowed.
* @param callable $processMessage A callable (function) that processes a single message.
* @return array An array containing the results of processing each message,
* including success/failure status and any error messages.
*/
function processQueue(array $queue, int $maxAttempts, callable $processMessage): array
{
$results = [];
foreach ($queue as $message) {
$attempts = $message['attempts'] ?? 0; // Default to 0 attempts if not set
$success = false;
$errorMessage = null;
$attempt = 0;
while (!$success && $attempt < $maxAttempts) {
$attempt++;
try {
$result = $processMessage($message);
$success = true;
} catch (Exception $e) {
$errorMessage = "Attempt " . $attempt . " failed: " . $e->getMessage();
}
if (!$success) {
$message['attempts'] = $attempts + 1; // Increment attempts
usleep(100000); // Sleep for 100ms before retrying (optional)
}
}
$results[] = [
'message' => $message,
'success' => $success,
'errorMessage' => $errorMessage,
'attempted' => $attempt
];
}
return $results;
}
/**
* Example usage (replace with your actual message processing logic).
*/
if (count($argv) > 1) {
$queueData = json_decode(file_get_contents($argv[1]), true);
if (is_array($queueData)) {
$results = processQueue($queueData, 3, function ($message) {
// Simulate a message processing operation
if (rand(0, 2) == 0) {
throw new Exception("Simulated processing error");
}
return "Message processed successfully: " . json_encode($message);
});
echo json_encode($results, JSON_PRETTY_PRINT); // Output results
} else {
echo "Invalid queue data format.\n";
}
} else {
echo "Usage: php script.php <queue_data_file>\n";
}
?>
Add your comment