1

我试图延迟 Laravel 中被分派到 AWS SQS 队列的作业。未延迟的标准作业在该队列上运行良好,但一旦我延迟某些东西,它就会崩溃。我第一次尝试:

$awsgatewayjob = new \App\Jobs\DispatchAwsGatewayJob();
$this->dispatch($awsgatewayjob)->delay(now()->addMinutes(1));

这会产生错误: Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_ERROR) Call to a member function delay() on string

接下来,我尝试使用 Laravel 在手册中解释的样式:

DispatchAwsGatewayJob::dispatch()->delay(now()->addMinutes(1));

这给出了错误:

Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_ERROR) 调用未定义的方法 Maqe\LaravelSqsFifo\SqsFifoQueue::getSeconds()

我用谷歌搜索了最后一个错误,我很高兴地报告我不是唯一遇到该错误的人:https ://github.com/maqe/laravel-sqs-fifo/issues/7

无论如何,我不明白。我在 Laravel 5.5 上运行,并使用 composer update 更新了我的所有包,以确保我没有使用过时的包。

有任何想法吗?

这是该作业的(编辑的)代码:

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

use Auth;
use Session;

use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
use Alert;


class DispatchAwsGatewayJob implements ShouldQueue
{

  private $method;
  private $rest_method;
  private $data;

  use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

  /**
  * Create a new job instance.
  *
  * @return void
  */
  public function __construct($method, $rest_method, $data)
  {
    $this->method = $method;
    $this->rest_method = $rest_method;
    $this->data = $data;

  }

  /**
  * Execute the job.
  *
  * @return void
  */
  public function handle()
  {
    $curl = curl_init();
    
    // some more stuff here to config $curl

    $result = curl_exec($curl);
    curl_close($curl);
  }
}

这是完整的错误日志:

Symfony\Component\Debug\Exception\FatalThrowableError 抛出消息“调用未定义的方法 Maqe\LaravelSqsFifo\SqsFifoQueue::getSeconds()”

堆栈跟踪:

0 Symfony\Component\Debug\Exception\FatalThrowableError 在 /var/www/sparkwebsite/vendor/maqe/laravel-sqs-fifo/src/SqsFifoQueue.php:42

这是完整的堆栈跟踪。我现在使用标准队列,一切运行良好!

4

1 回答 1

4

您的具体错误是因为该getSeconds()方法已在 Laravel 5.4 中删除。该软件包在 master 分支中进行了更新以添加 5.4+ 兼容性,但没有带有该代码的标记版本,因此您必须更新您的 composer.json 文件以指向dev-master.

然而,这里还有一个更大的问题。虽然您正在使用的包尝试支持该delay功能,但这实际上并不正确。

SQS FIFO 队列不支持每条消息延迟。它们仅支持按队列延迟,这意味着您必须在 AWS 中定义延迟(最多 15 分钟)的队列,如下面的屏幕截图所示。尝试对发送到未定义延迟的队列的消息设置延迟不会有任何效果。

概述了延迟的 SQS 设置

因此,如果您有一些不使用延迟的作业和一些确实使用延迟的作业,您将需要创建至少两个队列:一个没有定义延迟,一个定义了延迟。然后,delay()您必须使用该onQueue()方法将您的作业发送到延迟定义的队列,而不是使用该方法。

全面披露:我还创建了一个 Laravel 包来处理 SQS FIFO 队列(shiftonelabs/laravel-sqs-fifo-queue)。由于 FIFO 队列的每条消息延迟限制,我的包在尝试时会抛出异常(BadMethodCallException('FIFO queues do not support per-message delays.')),尽管可以通过包配置更改此行为(如此处所述)。

我的包还支持指定其他 FIFO 特定值的能力,例如消息组 id 和重复数据删除 id。

于 2018-05-08T20:21:45.630 回答