草庐IT

php - Laravel 队列作业失败说 Undefined property 但作业在没有队列的情况下运行正常?

coder 2024-04-17 原文

我正在处理一个队列作业,它从其他 API 导入一些数据并存储它们。

在我的 Controller 中,当我说 $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) . '%)'
        ]);
    }
}

它在我在 try catch 语句中说 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 属性未定义,但我不明白为什么。它非常明确,并且在作业未排队时运行良好。我做错了什么?

更新

所以我意识到我忘记为客户声明 protected 属性。但是我一这样做,就遇到了这个错误。该作业不再排队,但异常显示:不允许“Closure”序列化

我假设我无法以某种方式序列化和存储 Guzzle 客户端

最佳答案

所以 Guzzle 闭包没有被序列化,因为它不能序列化闭包。这就是让我失望的原因。

Exception: Serialization of 'Closure' is not allowed

如果您有同样的问题,这可能是一个很好的起点。

我用更简单的方法解决了它。我只是将客户端的声明移到句柄方法中并使它们成为局部变量,在这种情况下它们不必被序列化,只需坐在那里直到某些工作使用它们。

关于php - Laravel 队列作业失败说 Undefined property 但作业在没有队列的情况下运行正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38889605/

有关php - Laravel 队列作业失败说 Undefined property 但作业在没有队列的情况下运行正常?的更多相关文章

  1. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  2. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  3. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  4. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  5. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  6. 没有类的 Ruby 方法? - 2

    大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow

  7. ruby - 在不使用 RVM 的情况下在 Mac 上卸载和升级 Ruby - 2

    我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案

  8. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  9. ruby - 分布式事务和队列,ruby,erlang,scala - 2

    我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和

  10. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

随机推荐