如果作业已在 Laravel 队列中,则防止类似的队列作业

问题描述 投票:0回答:3

我正在使用 Beanstalkd 和 laravel 来处理队列作业。如果作业已在队列中,如何防止添加相同的作业。我正在使用 laravel 5.3 和 Beanstalkd 3.1

laravel-5 beanstalkd
3个回答
0
投票

不存在阻止作业成为消息队列一部分的概念。 只是你不能这样做。

确保您的代码编写方式能够处理重复项。如果您仍然需要解决一些问题,也许可以检查 Redis 的 SortedSet,并使用它来永久存储您的工作。


0
投票

此解决方法将有所帮助:

class ClientSendInvoice implements ShouldQueue {

use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

public $uuid, $cacheKey;
/**
 * Create a new job instance.
 *
 * @return void
 * @throws InvalidArgumentException
*/
public function __construct()
{
   $this->delay = 5;
   $this->uuid = Str::uuid();
   $this->cacheKey = "ClientSendInvoice_{$this->invoice->id}";
   cache()->put($this->cacheKey, $this->uuid, $this->delay);
}

/**
 * Execute the job.
 *
 * @return void
 */
public function handle(Invoice $invoice)
{
    if (cache()->get($this->cacheKey, $this->uuid) === $this->uuid) {
        Mail::to($invoice->client)
            ->send(new ClientInvoice(['invoice' => $invoice]));
    }
}

-1
投票

有一个解决方案,您可以尝试在分派队列之前添加以下代码

$queue = \DB::table(config('queue.connections.database.table'))->first();
    if($queue){
        $payload = json_decode($queue->payload,true);
        if($payload['displayName'] == 'App\Jobs\ProcessReport'){
            \flash('The report in process','info');
            return back()->withInput();
        }
    }
//dispatch the queue
ProcessReport::dispatch();
© www.soinside.com 2019 - 2024. All rights reserved.