onQueue('feed-discovery'); } public function handle(): void { LogSaver::info('Starting feed article fetch', null, [ 'feed_id' => $this->feed->id, 'feed_name' => $this->feed->name, 'feed_url' => $this->feed->url ]); $articles = ArticleFetcher::getArticlesFromFeed($this->feed); LogSaver::info('Feed article fetch completed', null, [ 'feed_id' => $this->feed->id, 'feed_name' => $this->feed->name, 'articles_count' => $articles->count() ]); $this->feed->update(['last_fetched_at' => now()]); } public static function dispatchForAllActiveFeeds(): void { Feed::where('is_active', true) ->get() ->each(function (Feed $feed, $index) { // Space jobs apart to avoid overwhelming feeds $delayMinutes = $index * self::FEED_DISCOVERY_DELAY_MINUTES; self::dispatch($feed) ->delay(now()->addMinutes($delayMinutes)) ->onQueue('feed-discovery'); LogSaver::info('Dispatched feed discovery job', null, [ 'feed_id' => $feed->id, 'feed_name' => $feed->name, 'delay_minutes' => $delayMinutes ]); }); } }