覆盖AWS SDK中单个调用的重试/重试决策程序

时间:2018-07-07 11:47:15

标签: php amazon-web-services aws-sdk aws-php-sdk

是否有一种方法可以覆盖适用于PHP的AWS开发工具包中的单个调用的重试?

以下代码解释了该问题:

// 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.

重试由中间件处理-但是由于将中间件类标记为“最终”,我需要传递“决定符”吗?这意味着我们需要挂接到其中一个处理程序,但似乎没有一个与重试相关。

编辑:

通过按如下所示直接编辑AWS开发工具包,我设法证明了新“决策者”的概念:

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 个答案:

答案 0 :(得分:1)

下一个代码删除重试处理程序

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

之后,Sqs客户端将不会重试。要恢复默认行为,您可以附加默认处理程序

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

尽管如此,两个分别启用和禁用重试的客户端对我来说听起来更加透明。