代码之家  ›  专栏  ›  技术社区  ›  Robbie

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

  •  3
  • Robbie  · 技术社区  · 6 年前

    有没有一种方法可以覆盖针对单个调用在awsdk for 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.
    

    重试是由中间件来处理的——但是当中间件类被标记为“最终”时,我需要传递一个“决定符”?这意味着我们需要钩住其中一个处理程序,但似乎没有一个与重试连接。

    编辑:

    我通过直接编辑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 回复  |  直到 6 年前
        1
  •  2
  •   vl.lapikov    6 年前

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

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