logger->info('[MonitorDispatcher] Executing MonitorDispatcher'); $this->cleanupStuckMonitors(); $monitorHandlers = [ 'movie' => MonitorMovieCommand::class, 'tvepisode' => MonitorTvEpisodeCommand::class, 'tvseason' => MonitorTvSeasonCommand::class, 'tvshows' => MonitorTvShowCommand::class, ]; $monitors = $this->monitorRepository->findBy(['status' => ['New', 'Active']]); foreach ($monitors as $monitor) { $monitor->setStatus('In Progress'); $this->monitorRepository->getEntityManager()->flush(); $command = $monitorHandlers[$monitor->getMonitorType()]; $this->logger->info('[MonitorDispatcher] Dispatching ' . $command . ' for ' . $monitor->getTitle()); $this->bus->dispatch(new $command($monitor->getId())); } } private function cleanupStuckMonitors(): void { $hoursStuck = 4; $monitors = $this->monitorRepository->findBy(['status' => 'In Progress']); foreach ($monitors as $monitor) { // Reset the status to active so it will be executed again if ($monitor->getLastSearch()->diffInHours(Carbon::today()) > $hoursStuck) { $this->logger->info('[MonitorDispatcher] Cleaning up monitor: ' . $monitor->getId() . ' (' . $monitor->getTitle() . '), resetting status to \'Active\' from \''. $monitor->getStatus() .'\' after being stuck for ' . $hoursStuck . ' hours.'); $monitor->setStatus('Active'); } } $this->monitorRepository->getEntityManager()->flush(); } }