2010-09-17 6 views

risposta

5

Sì, funzionerà. Su una app Web su cui ho lavorato, avevo bisogno di inviare un'email di notifica a seconda dell'azione dell'utente. Ho aggiunto un intercettatore post-commit sul servizio e ho ricevuto il fuoco dall'e-mail in un thread separato. (Nel mio caso è stato più pulito che inserire il codice nel controller, perché volevo che succedesse solo se la transazione è stata eseguita.)

È necessario assicurarsi che il thread interrompa effettivamente l'esecuzione a un certo punto, sia impostando daemon su true (se è ok che l'arresto del server uccide il thread senza preavviso) o assicurandosi che il codice nel suo metodo di esecuzione terminerà sempre ad un certo punto.

Si sta meglio con un pool di thread che creare nuove discussioni, quindi non si rischia l'esaurimento delle risorse (le discussioni stallo di solito non sono eventi indipendenti, se un thread si blocca il prossimo probabilmente sarà troppo, quindi è necessario un modo per tagliare le perdite). I metodi annotati con @Async verranno eseguiti utilizzando un executor che è possibile configurare come mostrato in the Spring documentation.

+0

Forse utile ricordare che il Controller non è in grado di avvisare l'utente quando invia una e-mail non riuscita (a meno che non si usi Callable.get() che tipo di sconfigge lo scopo di un altro thread qui). – extraneon

+0

Se voglio usare un pool di thread, come posso ottenere che ci sia un solo threadpool utilizzato per tutti gli utenti/richieste sul server? Modifica: può essere fatto estendendo il bean threadpool a "singleton"? – Erik

4

Sì, è possibile avviare una nuova discussione in Controller. Ma il modo migliore di fare un lavoro asincrono è usare il supporto della programmazione di primavera. Puoi sfruttare il framework Quartz. Questo gestirà il tuo lavoro.

Questo link vi darà come integrare questo nella vostra applicazione.

+1

Puoi capire perché usare la programmazione a molla/Quartz è meglio che iniziare una nuova discussione in questo caso? – Valera

Problemi correlati