代码之家  ›  专栏  ›  技术社区  ›  Oleg Shakhov

Laravel 5.5作业链接:调用未定义的方法::chain()

  •  0
  • Oleg Shakhov  · 技术社区  · 8 年前

    我有两个作业,第一个需要在运行前调度第二个作业,我找到了作业链,但无法使其工作,所有作业都是从盒子中设置的,所以理论上它应该可以工作。 这是我的第一份工作:

    namespace App\Jobs;
    
    class MCSendJob
    {
        use Dispatchable, InteractsWithQueue;
    
        public function handle(Config $config, MCReport $report)
        {
            if ($config->mcdb_status) {
                $report->setConnection('mcdb');
            } elseif ($config->rmcdb_status) {
                $report->setConnection('rmcdb');
            } else {
                $this->fail(new \Exception('No active MCDB connection found!'));
            }
    
            $models = collect([
                'appoitments' => Appointment::sent(false)->get(),
                'questions' => Question::sent(false)->get(),
                'price-clarifications' => PriceClarification::sent(false)->get(),
            ])->flatten(1);
    
            foreach ($models as $model) {
                $report->fill((new MCResource($model))->resolve());
                $report->save();
    
                $model->update(['mc_sent' => true]);
            }
    
            Log::info('MCSend done.');
        }
    }
    

    第二个:

    namespace App\Jobs;
    
    class MCCheckJob
    {
        use Dispatchable, Queueable, MailerDriverMail;
    
        protected $dbConnection;
    
        public function __construct($dbConnection)
        {
            $this->dbConnection = $dbConnection;
        }
    
        public function handle(Config $config)
        {
            try {
                DB::connection($this->dbConnection)->getPdo();
                $config->{$this->dbConnection . '_status'} = true;
                $config->save();
                Log::info('MCCheck done.');
            } catch (PDOException $exception) {
                if ($this->dbConnection === 'mcdb') {
                    Log::error('MCDB connection unavailable!');
    
                    $config->mcdb_status = false;
    
                    static::dispatch('rmcdb');
                } else {
                    Log::error('RMCDB connection unavailable!');
    
                    $config->rmcdb_status = false;
                }
    
                $config->save();
    
                Log::error('SQLSrv PDO Exception', ['error_code' => $exception->getErrorCode(), 'error_info' => $exception->getMessage()]);
    
                if(!empty($config->mailing_list_mc_reports)) {
                    Mail::to($config->mailing_list_mc_reports)->send(new MCNoConnectionWarning($this->dbConnection));
                }
            }
        }
    }
    

    当我尝试使用链调度作业时,如下所示: MCSendJob::dispatch()->chain([new MCCheckJob('mcdb')]) ,或: MCSendJob::withChain([new MCCheckJob('mcdb')])->dispatch(); 我收到下一个错误: Call to undefined method App\Jobs\MCSendJob::chain() .我发现这些方法 Illuminate\Foundation\Bus\PendingDispatch

    无法找出问题所在。

    3 回复  |  直到 8 年前
        1
  •  3
  •   BrandenB171    8 年前

    您需要在两个作业中都使用排队特性

        2
  •  1
  •   garethwi    6 年前

    我也遇到了同样的问题,这与Horizon将错误的早期版本的脚本加载到内存中有关。

    地平线快速重启,一切又恢复正常。

        3
  •  0
  •   SoheilYou    6 年前

    我也有同样的问题,通过重启supervisor解决了:

    service supervisord stop
    service supervisord force-reload
    
    推荐文章