Non dovresti avviare processi di lunga durata di alcun tipo da un'app web. Rende difficile fare cose come il failover su un altro nodo nel cluster.
Invece, invia il "run this" a qualcosa al di fuori della webapp (e quindi fuori da Spring) in modo che la webapp possa continuare con la sua vita (ciclo).
Invece di avere un processo (all'interno del contenitore web) che esegue la raccolta, sposta questo processo su qualcosa che si trova all'esterno del contenitore web. Un processo autonomo che in qualche modo riceve un messaggio dalla webapp e poi inizia a fare la sua cosa.
Questo "invio di un messaggio" potrebbe essere fatto con una coda di messaggi, o anche solo attaccare una riga in un database. L'altro processo ascolta i messaggi nella coda dei messaggi (e quindi avvia un thread di lavoro) o esegue periodicamente il polling del database (e quindi avvia un thread di lavoro).
Il thread di lavoro avvia quindi l'elaborazione della pagina. Una cosa che il thread di lavoro potrebbe quindi fare è inserire nuovamente i nuovi URL nella coda di messaggi o nel database affinché il dispatcher prenda e crei nuovi thread. Probabilmente vorresti usare un pool di thread per evitare il sovraccarico del tuo sistema (ci sono N lavoratori disponibili nel pool - se nessuno è disponibile, aspetti che uno sia). Questa sarebbe anche la posizione per assicurarti di limitare correttamente le richieste a un singolo server (di nuovo, per essere sicuro di non sovraccaricare il loro sistema).