Brotzka
Brotzka

Reputation: 2785

Laravel Job::dispatch() results in undefined method error

Update

Job::dispatchNow() works fine.


I've updated my Laravel application from version 5.7 to 5.8.

Now some of my jobs fail with a message saying, that the SyncJob::dispatch() method is undefined. The upgrade guide only mentions that the fire() method was removed in this version.

Any ideas where the problem lies? I've tried to create new Jobs resulting in the same error. I've deleted an reinstalled the complete vendor-directory, dumped autoload, removed the cache etc.

The Job is triggered my a scheduled command:

    protected function schedule(Schedule $schedule)
    {
        // ...
        $schedule->command(RenewSubscriptionsCommand::class)->dailyAt('00:01');
        // ...
    }

This is the called command:

    public function handle()
    {
        // ...
        $subscriptions = SubscriptionService::collect()->getAllActiveSubscriptions();
        foreach($subscriptions as $subscription){
            dispatch(new RenewSubscriptionJob($subscription));
        }
        // ...
    }

And finally the Job:

    <?php
    
    namespace Subscription\Jobs;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;
    use Subscription\Database\Entities\Subscription;
    use Subscription\Exceptions\SubscriptionException;
    use Subscription\SubscriptionService;
    
    class RenewSubscriptionJob implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        protected $subscription = NULL;
    
        /**
         * RenewSubscriptionJob constructor.
         * @param Subscription $subscription
         */
        public function __construct(Subscription $subscription)
        {
            $this->subscription = $subscription;
        }
    
        /**
         * @throws SubscriptionException
         */
        public function handle(): void
        {
            SubscriptionService::init($this->getSubscription())->renew();
        }
    
        protected function getSubscription(): Subscription
        {
            if($this->subscription instanceof Subscription){
                return $this->subscription;
            } else {
                throw new SubscriptionException("Could not renew Subscription! No Subscription-Entity given!");
            }
        }
    }

And the complete stack trace:

   Symfony\Component\Debug\Exception\FatalThrowableError  : Call to undefined method Illuminate\Queue\Jobs\SyncJob::dispatch()

  at /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Queue/SyncQueue.php:42
    38|
    39|         try {
    40|             $this->raiseBeforeJobEvent($queueJob);
    41|
  > 42|             $queueJob->dispatch();
    43|
    44|             $this->raiseAfterJobEvent($queueJob);
    45|         } catch (Exception $e) {
    46|             $this->handleException($queueJob, $e);

Exception trace:

  1   Illuminate\Queue\SyncQueue::push(Object(Subscription\Jobs\RenewSubscriptionJob))
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php:184

  2   Illuminate\Bus\Dispatcher::pushCommandToQueue(Object(Illuminate\Queue\SyncQueue), Object(Subscription\Jobs\RenewSubscriptionJob))
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php:160

  3   Illuminate\Bus\Dispatcher::dispatchToQueue(Object(Subscription\Jobs\RenewSubscriptionJob))
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Bus/Dispatcher.php:73

  4   Illuminate\Bus\Dispatcher::dispatch(Object(Subscription\Jobs\RenewSubscriptionJob))
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Foundation/Bus/PendingDispatch.php:112

  5   Illuminate\Foundation\Bus\PendingDispatch::__destruct()
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:399

  6   dispatch(Object(Subscription\Jobs\RenewSubscriptionJob))
      /home/vagrant/faaren/repositories/website-and-consumer-area/packages/subscription/Commands/RenewSubscriptionsCommand.php:45

  7   Subscription\Commands\RenewSubscriptionsCommand::handle()
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:32

  8   call_user_func_array([])
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:32

  9   Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:90

  10  Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Object(Closure))
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:34

  11  Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), [])
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Container/Container.php:580

  12  Illuminate\Container\Container::call()
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Console/Command.php:183

  13  Illuminate\Console\Command::execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/symfony/console/Command/Command.php:255

  14  Symfony\Component\Console\Command\Command::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Console/Command.php:170

  15  Illuminate\Console\Command::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/symfony/console/Application.php:908

  16  Symfony\Component\Console\Application::doRunCommand(Object(Subscription\Commands\RenewSubscriptionsCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/symfony/console/Application.php:269

  17  Symfony\Component\Console\Application::doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/symfony/console/Application.php:145

  18  Symfony\Component\Console\Application::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Console/Application.php:90

  19  Illuminate\Console\Application::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      /home/vagrant/faaren/repositories/website-and-consumer-area/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:122

  20  Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      /home/vagrant/faaren/repositories/website-and-consumer-area/artisan:37

Upvotes: 3

Views: 12866

Answers (1)

Surender Singh Rawat
Surender Singh Rawat

Reputation: 919

dispatch Job like this in foreach loop :

RenewSubscriptionJob::dispatch($subscription);

Upvotes: 1

Related Questions