4

私は Laravel 5.1 を使用しており、Queue サービスが組み込まれています (Redis ドライバーを使用)。

キュー リスナーは次のようになります。

php artisan queue:listen --tries=5 --delay=60 redis

ジョブクラス自体で応答を確認し、それが肯定的な応答である場合は$this->delete()、キューからジョブを削除するために使用しますが、成功しない場合でも、失敗したかどうかに関係なく、ジョブは 5 回起動します。

これは私が使用するジョブファイルです:

<?php

namespace LM2\Jobs;

use LM2\Http\Controllers\API;
use LM2\Http\Controllers\PredictionsController;
use LM2\Jobs\Job;
use Illuminate\Support\Facades\Log;
use LM2\Http\Controllers\AnalyticsController;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
use LM2\Models\Client;
use LM2\Models\GoogleIntegration;
use LM2\Models\Lead;

class CompleteLeadAnalyticsDetails extends Job implements SelfHandling, ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    const NUMBER_OF_TRIES = 5;

    private $lead;
    private $client;

    public function __construct(Lead $lead, Client $client)
    {
        $this->lead   = $lead;
        $this->client = $client;
    }

    public function handle(AnalyticsController $analyticsController, API $api,PredictionsController $prediction)
    {
        Log::info("Inside CompleteLeadAnalyticsDetails::handle()");
        $integration = GoogleIntegration::where('client_id', $this->client->id)->first();
        if(count($integration) > 0){
            if($this->attempts() > 1){
                Log::info("CompleteLeadAnalyticsDetails::handle() attempt ".$this->attempts());
                $this->release(120);
                Log::info("CompleteLeadAnalyticsDetails::handle() released");
            }
            try{
                if(count($this->lead->ga_details) > 1){
                    return;
                }
                $res = $analyticsController->getLeadDetails($integration->view_id,$this->lead->ga_details['uacid'],$this->lead->_id,$this->client);
                Log::info("Analytics response: ".$res);
                Log::info('has $res');
                if($res){
                    if(isset($this->lead->email_sent) && (bool)$this->lead->email_sent){
                        return;
                    }else {
                        $prediction->predict($this->lead, $this->client);
                        $api->sendLeadEmail($res, $this->client);
                        $api->forwardToWebService($this->client, $this->lead);
                        Log::info('email sent');
                        $this->delete();
                        return true;
                    }
                }
            }catch (\Exception $e){
                Log::info('no $res, number of attempts:'.$this->attempts()." for lead id:".$this->lead->_id.' number of Attempts: '.$this->attempts());
                if($this->attempts() == self::NUMBER_OF_TRIES){
                    $api->forwardToWebService($this->client,$this->lead);
                    $api->sendLeadEmail($this->lead, $this->client);
                    Log::info('email sent, no $res');
                    $this->delete();
                }
                throw new \Exception('No response for lead id '.$this->lead->_id.' is breaking the job??');
                return false;
            }
        }else{
            if(isset($this->lead->email_sent) && (bool)$this->lead->email_sent){
                return;
            }
            $api->forwardToWebService($this->client,$this->lead);
            $api->sendLeadEmail($this->lead, $this->client);
            Log::info("Client ".$this->client->name.', id:'.$this->client->id.' was not integrate with google CompleteLeadAnalyticsDetails on line:62');
            $this->delete();
        }
        return true;
    }
}

なぜそれが起こっているのか、そしてそれに対する解決策は何ですか?

どんな助けにも感謝します!:)

4

2 に答える 2

0

これは古いスレッドであることは知っていますが、同じ問題に直面したときは、コマンドでキューを開始するのを忘れたためでしたphp artisan queue:listen。その後、$this->delete働いた。

于 2016-11-29T14:21:46.587 に答える