为 AWS SDK 中的单个调用覆盖重试/重试决策程序
Overwriting retries / retry decider for individual calls in AWS SDK
有没有办法在 PHP 的 AWS SDK 中覆盖单个调用的重试?
下面的代码解释了问题:
// 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.
重试由中间件处理 - 但是由于中间件 class 被标记为 "final" 我需要传入一个 "decider"?这意味着我们需要连接到其中一个处理程序,但 none 似乎已连接到重试。
编辑:
我已经通过直接编辑 AWS SDK 来证明新 "decider" 的概念,如下所示:
final class Middleware
{
public static function retry(
callable $decider = null,
callable $delay = null,
$stats = false
) {
....
$decider = function() {
echo 'retries cancelled';
return false;
};
....
所以问题是如何在不编辑 SDK 的情况下执行此操作。试过如下各种中间件hook,都没有成功。
$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'
);
不过,启用和禁用重试的两个独立客户端对我来说听起来更透明。
有没有办法在 PHP 的 AWS SDK 中覆盖单个调用的重试?
下面的代码解释了问题:
// 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.
重试由中间件处理 - 但是由于中间件 class 被标记为 "final" 我需要传入一个 "decider"?这意味着我们需要连接到其中一个处理程序,但 none 似乎已连接到重试。
编辑:
我已经通过直接编辑 AWS SDK 来证明新 "decider" 的概念,如下所示:
final class Middleware
{
public static function retry(
callable $decider = null,
callable $delay = null,
$stats = false
) {
....
$decider = function() {
echo 'retries cancelled';
return false;
};
....
所以问题是如何在不编辑 SDK 的情况下执行此操作。试过如下各种中间件hook,都没有成功。
$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'
);
不过,启用和禁用重试的两个独立客户端对我来说听起来更透明。