Reputation: 13811
I am working on a queue job which imports some data from other APIs and stores them.
From my controller, when I say $this->dispatchNow(new ImportPatentsJob($numbers, $count, $invention_id, $redisId));
, it works all fine and the process goes through without fail.
But when I change it to dispatch
and queue the job and then run it via the queue worker, it fails. My job looks something like:
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) . '%)'
]);
}
}
It fails at the point where I am saying Log::info($e)
in the try catch statement. The exception reads like:
[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}
It says the dataClient
property is undefined but I cannot figure out why. It is pretty much defined and it works well when the job is not queued. What am I doing wrong?
UPDATE
So I realised I had forgot to declare the protected properties for the clients. But as soon as I did that, I ran in to this error. The job is not longer queued but it Exception says: Serialization of 'Closure' is not allowed
I am assuming that somehow I cannot serialise and store Guzzle clients
Upvotes: 4
Views: 3299
Reputation: 13811
So the Guzzle closures were not being serialized because it cannot serialize closures. Which is what was throwing me off.
Exception: Serialization of 'Closure' is not allowed
This can be a good place to start if you have the same problem.
I solved it in a simpler way. I just moved the declaration of the clients inside the handle methods and made them local variables in which case they did not had to be serialized, just sit there until some job uses them.
Upvotes: 3