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.
fonte
2010-09-17 11:47:04
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
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