Перезапись повторных попыток / определение повторных попыток для отдельных вызовов в AWS SDK

Существует ли способ перезаписи повторов для отдельного вызова в AWS SDK для PHP?

Следующий код объясняет вопрос:

// Create client with a default of 2 retries
$sqsClient = new sqsClient('2012-11-05', ['retries' => 2]);

// This will retry twice to get the queue attributes (perfect)
try {
    $sqsClient->getQueueAttributes();
} catch(Exception $e) {
}

// I want the following to NEVER retry
try {
    $sqsClient->turnOffRetryLogic(???);
    $sqsClient->receiveMessages(['WaitTimeSeconds' => 5]);
} catch(Exception $e) {
}

// Now set the retries back to as before.

Попытки обрабатываются Middleware - но так как класс Middleware помечен как "окончательный", мне нужно передать "decider"? Это означает, что нам нужно подключиться к одному из обработчиков, но ни один из них не связан с повторными попытками.

Редактировать:

Мне удалось доказать концепцию нового "решающего элемента" путем прямого редактирования AWS SDK следующим образом:

final class Middleware
{
    public static function retry(
        callable $decider = null,
        callable $delay = null,
        $stats = false
    ) {
    ....
    $decider = function() {
        echo 'retries cancelled';
        return false;
    };
    ....

Поэтому вопрос заключается в том, как сделать это без редактирования SDK. Перепробовал различные промежуточные крючки следующим образом, но безуспешно.

$decider = function() {
    echo 'No retries';
    return false;
};
$SqsClient->getHandlerList()->appendSign(\AWS\Middleware::retry($decider, null), 'retry');
$result = $SqsClient->receiveMessage($aParams);

(Примеры кода вырезаны, чтобы показать только соответствующие части)

1 ответ

Решение

Следующий код удаляет обработчик повторов

$sqsClient->getHandlerList()->remove('retry');

Sqs клиент не собирается повторять попытки после этого. Чтобы восстановить поведение по умолчанию, вы можете прикрепить обработчик по умолчанию обратно

$decider = RetryMiddleware::createDefaultDecider(3);
$sqsClient->getHandlerList()->appendSign(
    Middleware::retry($decider, null, false),
    'retry'
);

Хотя два отдельных клиента с включенными и отключенными повторными попытками звучат для меня более прозрачно.

Другие вопросы по тегам