Я использую 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);
}
}
Работа для успешного завершения