2016-08-11 1 views
3

Я работаю над заданием очереди, которое импортирует некоторые данные из других API и сохраняет их.Работа в очереди на Laravel не позволяет определить неопределенное свойство, но работа выполняется нормально без очереди?

От моего контроллера, когда я говорю $this->dispatchNow(new ImportPatentsJob($numbers, $count, $invention_id, $redisId));, он отлично работает и процесс проходит в обязательном порядке.

Но когда я меняю его на dispatch и ставим в очередь задание, а затем запускаем его через рабочий стол, он терпит неудачу. Моя работа выглядит примерно так:

protected $numbers; 
protected $count; 
protected $invention_id; 
protected $redisId; 

/** 
* Create a new job instance. 
* 
* @return void 
*/ 
public function __construct($numbers, $count, $invention_id, $redisId) 
{ 
    $this->numbers = $numbers; 
    $this->count = $count; 
    $this->invention_id = $invention_id; 
    $this->redisId = $redisId; 

    $this->onQueue('import'); 
    $this->setUpClients(); 
} 

protected function setUpClients() 
{ 
    $this->imageClient = new Client([ 
     'base_uri' => 'some-uri', 
     'headers' => ['API-TOKEN' => env('API_TOKEN')], 
    ]); 

    $this->dataClient = new Client([ 
     'base_uri' => 'some-uri', 
     'headers' => ['API-TOKEN' => env('API_TOKEN')], 
    ]); 

    $this->familyClient = new Client([ 
     'base_uri' => 'some-uri', 
     'headers' => ['API-TOKEN' => env('API_TOKEN')], 
    ]); 
} 

/** 
* Execute the job. 
* 
* @return void 
*/ 
public function handle() 
{ 
    $folder_id = $this->createFolder(); 

    $currentCount = 0; 

    foreach ($this->numbers as $number) { 

     $currentCount++; 

     Redis::executeRaw(['SET', 'importlog:' . $this->redisId, 'Import ' . $number['number']]); 

     try { 
      $response = $this->dataClient->get($number['number']); // this is line 85 where the exception occurs 
     } catch (\Exception $e) { 
      Redis::executeRaw(['SET', 'importlog:' . $this->redisId . ':fail:' . $number['number'], 'Could not import']); 
      Log::info($e); 
      continue; 
     } 

     $data = $this->decodeData($response); 
     $patent_id = $this->createPatentDocument($data, $folder_id); 

     $this->createPatentAddresses($data, $patent_id); 
     $this->createPatentApplications($data, $patent_id); 
     $this->createPatentPriorities($data, $patent_id); 
     $this->createPatentCitations($data, $patent_id); 
     $this->createPatentTaxonomies($data, $patent_id); 
     $this->createPatentTitles($data, $patent_id); 
     $this->createPatentAbstracts($data, $patent_id); 
     $this->createPatentClaims($data, $patent_id); 
     $this->createPatentDescriptions($data, $patent_id); 

     $this->createInventionResults($this->invention_id, $patent_id, $number['position']); 

     try { 
      $response = $this->imageClient->get($data['bibliographic']['root']['family']); 
      $blob = $this->fetchImageBlob($response, $number['number']); 
      if ($blob) { 
       $this->createFile($blob, $patent_id); 
      } 
     } catch (\Exception $e) { 
      Redis::executeRaw([ 
       'SET', 
       'importlog:' . $this->redisId . ':fail:image:' . $number['number'], 
       'Patent number: ' . $number['number'] . '; Family number: ' . $data['bibliographic']['root']['family'], 
      ]); 
     } 

     Redis::executeRaw([ 
      'SET', 
      'importlog:' . $this->redisId . ':progress', 
      "Import progress: " . $currentCount . '/' . $this->count . '(' . ($currentCount/$this->count * 100) . '%)' 
     ]); 
    } 
} 

Он терпит неудачу в точке, где я говорю Log::info($e) в заявлении попытки поймать. Исключение читается как:

[2016-08-11 07:01:11] local.INFO: exception 'ErrorException' with message 'Undefined property: Uppdragshuset\AO\Tenant\Jobs\ImportPatentsJob::$dataClient' in /Users/rohan0793/Code/tenant-application/tenant-package/src/Jobs/ImportPatentsJob.php:85 
Stack trace: 
#0 /Users/rohan0793/Code/tenant-application/tenant-package/src/Jobs/ImportPatentsJob.php(85): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'Undefined prope...', '/Users/rohan079...', 85, Array) 
#1 [internal function]: Uppdragshuset\AO\Tenant\Jobs\ImportPatentsJob->handle() 
#2 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Container/Container.php(507): call_user_func_array(Array, Array) 
#3 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(82): Illuminate\Container\Container->call(Array) 
#4 [internal function]: Illuminate\Bus\Dispatcher->Illuminate\Bus\{closure}(Object(Uppdragshuset\AO\Tenant\Jobs\ImportPatentsJob)) 
#5 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(150): call_user_func(Object(Closure), Object(Uppdragshuset\AO\Tenant\Jobs\ImportPatentsJob)) 
#6 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Uppdragshuset\AO\Tenant\Jobs\ImportPatentsJob)) 
#7 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): call_user_func(Object(Closure), Object(Uppdragshuset\AO\Tenant\Jobs\ImportPatentsJob)) 
#8 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php(83): Illuminate\Pipeline\Pipeline->then(Object(Closure)) 
#9 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(41): Illuminate\Bus\Dispatcher->dispatchNow(Object(Uppdragshuset\AO\Tenant\Jobs\ImportPatentsJob)) 
#10 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(130): Illuminate\Queue\CallQueuedHandler->call(Object(Illuminate\Queue\Jobs\RedisJob), Array) 
#11 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Queue/Jobs/RedisJob.php(50): Illuminate\Queue\Jobs\Job->resolveAndFire(Array) 
#12 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(213): Illuminate\Queue\Jobs\RedisJob->fire() 
#13 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(157): Illuminate\Queue\Worker->process('redis', Object(Illuminate\Queue\Jobs\RedisJob), 0, 0) 
#14 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(126): Illuminate\Queue\Worker->pop(NULL, 'import', 0, 3, 0) 
#15 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(79): Illuminate\Queue\Console\WorkCommand->runWorker(NULL, 'import', 0, 128, false) 
#16 [internal function]: Illuminate\Queue\Console\WorkCommand->fire() 
#17 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Container/Container.php(507): call_user_func_array(Array, Array) 
#18 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Console/Command.php(169): Illuminate\Container\Container->call(Array) 
#19 /Users/rohan0793/Code/tenant-application/vendor/symfony/console/Command/Command.php(256): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
#20 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Console/Command.php(155): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
#21 /Users/rohan0793/Code/tenant-application/vendor/symfony/console/Application.php(791): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
#22 /Users/rohan0793/Code/tenant-application/vendor/symfony/console/Application.php(186): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
#23 /Users/rohan0793/Code/tenant-application/vendor/symfony/console/Application.php(117): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
#24 /Users/rohan0793/Code/tenant-application/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(107): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
#25 /Users/rohan0793/Code/tenant-application/artisan(36): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
#26 {main} 

Это говорит dataClient свойство не определено, но я не могу понять, почему. Он в значительной степени определен и работает хорошо, когда задание не помещено в очередь. Что я делаю не так?

UPDATE

Так я понял, что забыл объявить защищенные свойства для клиентов. Но как только я это сделал, я подбежал к этой ошибке. Задание не больше в очереди, но это исключение говорит: Serialization of 'Closure' is not allowed

Я предполагаю, что-то я не могу сериализация и магазин жрать клиентов

+0

Возможно, это поможет: http://stackoverflow.com/questions/13734224/exception-serialization-of-closure-is-not-allowed – Adrenaxus

+0

Да, это так. Проблема сериализации закрытий Guzzle. – Rohan

+0

Я рад. Пожалуйста, ответьте на свой вопрос и объясните, почему вы решили его для дальнейшего использования. – Adrenaxus

ответ

3

Так жрать затворы не сериализовано, потому что он не может сериализовать закрытия. Это то, что меня отбрасывало.

Exception: Serialization of 'Closure' is not allowed

Это может быть хорошим местом для начала, если у вас есть такая же проблема.

Я решил это более простым способом. Я просто переместил объявление клиентов внутри методов дескриптора и сделал их локальными переменными, и в этом случае их не нужно было сериализовать, просто сидите там, пока какая-то работа не использует их.