Quale dovrebbe essere il modo migliore per eseguire una lunga operazione in Java Spring?

2

Sto lavorando su un comparatore di prezzi, uno dei moduli di scansione delle applicazioni attraverso l'elenco dei siti Web rispetto al prodotto archiviato nel database e aggiorna il prezzo nel database dell'applicazione.

Questo crawler è un processo lento e potrebbe richiedere da 3 a 4 ore al giorno per essere completato. Per testare la scansione sul mio locale stavo eseguendo il metodo di servizio dal mio test di Junit.

Quale dovrebbe essere il modo migliore per eseguire questi servizi dopo aver ospitato l'applicazione in produzione?

    
posta Tushar 06.07.2015 - 07:45
fonte

2 risposte

2

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).

    
risposta data 09.07.2015 - 21:55
fonte
0

Dai un'occhiata link per eseguirlo in un contenitore come Tomcat o JBoss. Potresti eseguirlo alternativamente da cron (in una finestra Unix, ovviamente), come processo da riga di comando.

    
risposta data 09.07.2015 - 21:37
fonte

Leggi altre domande sui tag