Существует ли способ перезаписи повторов для отдельного вызова в 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);
(Примеры кода вырезаны, чтобы показать только соответствующие части)
Следующий код удаляет обработчик повторов
$sqsClient->getHandlerList()->remove('retry');
Sqs клиент не собирается повторять попытки после этого. Чтобы восстановить поведение по умолчанию, вы можете прикрепить обработчик по умолчанию обратно
$decider = RetryMiddleware::createDefaultDecider(3);
$sqsClient->getHandlerList()->appendSign(
Middleware::retry($decider, null, false),
'retry'
);
Хотя два отдельных клиента с включенными и отключенными повторными попытками звучат для меня более прозрачно.
Других решений пока нет …