Laravel Некоторые задания превышают максимальное количество попыток запуска / тайм-аут - PullRequest
0 голосов
/ 12 мая 2019

Я использую Eutilz из PubMed, чтобы сохранить реферат для моей модели вывода (https://www.ncbi.nlm.nih.gov/books/NBK25500/). Модель вывода содержит информацию об одной статье / журнале.

Я ограничил количество запросов в соответствии с рекомендациями Eutilz, используя https://github.com/hamburgscleanest/guzzle-advanced-throttle

Я подключил к наблюдателям моделей задание, которое запускается, когда я создаю модель вывода. Это тянет абстрактный текст от Eutilz.

При выполнении этой задачи для задания некоторые превышают максимальное количество попыток / выполняются слишком долго. У меня нет сообщений об ошибках, чтобы определить, что происходит не так. Все отдельные отправки в метод ProcessAbstract будут корректно извлекать реферат в неудачных случаях.

Если я извлекаю все выходные модели с пустыми рефератами и запускаю задание, оно работает нормально. Это не с моделью наблюдателей.

  **class OutputObserver**
    {
    /**
     * Handle the output "created" event.
     *
     * @param  \App\Output  $output
     * @return void
     */
    public function created(Output $output)
    {
      ProcessAbstract::dispatch($output);
    }



    **class ProcessAbstract implements ShouldQueue**
    {
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $tries = 1;
    public $timeout = 120;
    protected $output;


    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(Output $output)
    {
        $this->onQueue('abstracts');
        $this->onConnection('redis');
        $this->output= $output;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {

        Redis::funnel('key')->limit(1)->then(function () {
            // Job logic...
            $abstract = new AbstractFetcher($this->output);
            $abstract->fetch();
        }, function () {
            // Could not obtain lock...
            return $this->release(10);
        });
    }


    **class AbstractFetcher**
    {
    protected $output;
    public $apikey ='*******************';


    public function __construct(Output $output)
    {
        $this->doi = $output->doi;
        $this->output = $output;
    }

    public function fetch(){

        //TODO check the response codes
    try{
        $client = LaravelGuzzleThrottle::client(['base_uri' => 
    'https://eutils.ncbi.nlm.nih.gov/']);
        $res = $client->get($this->getAPIUrl());
        $xmlid = simplexml_load_string($res->getBody());
        $xmlid = $xmlid->IdList->Id->__toString();
        $client = LaravelGuzzleThrottle::client(['base_uri' => 
    'https://eutils.ncbi.nlm.nih.gov/']);
        $res = $client->get($this->getOutputUrl($xmlid));
        $xmlid = simplexml_load_string($res->getBody());

        if(isset($xmlid->PubmedArticle->MedlineCitation->Article->Abstract-  >AbstractText)){
            $stringpieces=[];
            foreach($xmlid->PubmedArticle->MedlineCitation->Article- 
   >Abstract->AbstractText as $text) {
                $stringpieces[]= (string) $text;
            }
            $abstract= implode(' ', $stringpieces);

            Output::where('doi', $this->doi)->update(['abstract' => 
    $abstract]);
        } else {
            die();
        }

    } catch(Exception $e){
        Log::alert('Error with processing abstract');
        Log::alert('Output ID ' . $this->output->id);
        Log::alert('Error Message' . $e->getMessage());
        Log::alert('API Url ' . $this->getAPIUrl());
        Log::alert('Output Url ' . $this->getOutputUrl('test'));
    };


    }

    public function getAPIUrl (){
        return  'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&WebEnv=1&usehistory=y&term='.$this->doi . '$api_key=' . $this->apikey;
    }

    public function getOutputUrl($xmid){
        $field = array('db' => 'pubmed', 'retmode' => 'xml', 'rettype' => 'abstract', 'id' => $xmid);
        return "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?".http_build_query($field);
    }

}

Работа для успешного завершения

...