Domanda

Ho un metodo che verrà utilizzato per l'invio di e-mail. voglio bloccare questo metodo in modo che solo un thread può accses esso per volta e la piscina riposare contemporaneamente. dovrebbero i sincronizzato il metodo o uso molla @Transactional PROPAGATION_REQUIRED?

nel mio livello di servizio

 //each time use new thread to send out email
  public  void sendThroughSMTP(List<String> emails,String subject,String content){

            //each time will open and sent through port 25.  dont u think this will caused too many threads spawned?
            BlastEmailThread blastEmailThread = new BlastEmailThread(emails,subject,content);

            blastEmailThread.start();


}
È stato utile?

Soluzione

Perché non fare il metodo thread-safe, non utilizzando qualsiasi cose a livello di esempio?

Tuttavia, non vedo come la gestione delle transazioni di Primavera si inserisce qui. Voglio dire Primavera offre alcuni gestori di transazioni, vale a dire, DataSourceTransactionManager JtaTransactionManager, HibernateTransactionManager tutto questo è circa la persistenza del database. Che cosa si configurare per questo invia fuori?

Credo che, per prima cosa ci dovrebbe mostrare perché ti preoccupi per il filo di sicurezza, in primo luogo. Molto probabilmente si desidera mostrarci qualche frammento di codice rilevante o qualcosa del genere. Poi potremmo essere in grado di suggerire qualcosa.

[Addendum]

Quando si è un thread per ogni chiamata a tale metodo e non usando niente da parte dello Stato, allora perché si vuole fare il metodo synchronized. Portando il metodo sincronizzato non limitare il numero di fili in alcun modo. Ci potrebbe essere la possibilità che prima di iniziare un nuovo thread, thread precedente potrebbe aver terminato il lavoro, a causa di sincronizzazione. Il processo di un thread potrebbe andare più lento.

Tuttavia, si dovrebbe andare con questo fino a quando si scopre che ci sono davvero molti thread in esecuzione e si sta andando fuori di memoria. E se si vuole veramente affrontare che, prima del tempo, allora si dovrebbe scegliere qualche meccanismo di blocco, qualcosa come Semaforo .

Altri suggerimenti

Un'altra possibilità sarebbe quella di utilizzare le code JMS e mettere il codice di invio e-mail in un messaggio Driven Bean (o tramite primavera JMS). È quindi possibile utilizzare il server app per controllare come verranno utilizzati molti casi concorrenti di un MDB e strozzare i messaggi di posta elettronica in uscita in quel modo.

in Sping 3.0 è possibile utilizzare @Async annotazione per fare l'esecuzione dell'attività, in modo che il metodo verrà eseguito più tardi e il metodo viene restituito direttamente senza aspettare e-mail da inviare.

@Async
public  void sendThroughSMTP(List<String> emails,String subject,String content){
//Send emails here, you can directly send lots of email
}

poi nel contesto applicativo si specifica e non dimenticare di aggiungere xmlns per lo schema compito.

Se si vuole ritardare l'esecuzione per certo periodo di tempo, è possibile utilizzare l'annotazione @Scheduled al metodo.

Ulteriori tutorial su @Async e @Scheduled può essere trovato qui:

http: // blog .springsource.com / 2010/01/05 / task-pianificazione-semplificazioni-in-primavera-3-0 /

Non sono sicuro se risponde alla tua domanda, ma invece di creare un nuovo thread per ogni posta e chiamando inizio su di esso si potrebbe avere un Executor o ExecutorService come un membro della vostra classe, come un'implementazione si potrebbe usare un ThreadPoolExecutor con una dimensione del pool di 1. Il vostro metodo di sendmail quindi inviare Runnables per l'esecutore.

Primavera @Transactional non è del tutto corretto utilizzato nel tuo caso. La cosa migliore sta usando il metodo synchorized e aggiungere qualche filo mettere in comune se il metodo chiamato da tempo centinaia. Ma credo che non avete bisogno di pool di thread qui.

Se si utilizza thread per inviare email esplosione, allora qual è il punto sincronizzare il metodo? se un processo chiamare il metodo e inviare e-mail, altro processo vi chiamerà metodo ancora il primo processo di invio di e-mail non ancora finire.

Se l'intenzione andare a diminuire il processo di invio di e-mail, è necessario condider una coda (raccolta) e proteggere la collezione con blocco di sincronizzazione. Creare un altro processo per monitorare quella coda, se c'è un elemento in coda, pop e inviare email esplosione, quindi attendere fino a quando l'invio di finitura processo di posta elettronica e controllare di nuovo la coda, se non v'è alcun elemento, continuano a processo di invio e-mail. Se nessun elemento nella coda, rendono il sonno thread di monitoraggio per qualche pezzo di tempo, quindi se il tempo del sonno è finire prova di nuovo la coda.

Fare il servizio di un singleton e aggiungere synchronized al metodo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top