Pregunta

Tengo un método que se utilizará para enviar correo electrónico. quiero cerrar este método tan sólo un hilo puede accses que por el tiempo y la piscina resto seguridad al mismo tiempo. debería sincronizado El método o uso de resorte @Transactional PROPAGATION_REQUIRED?

en mi capa de servicio

 //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();


}
¿Fue útil?

Solución

¿Por qué no hacer que el método seguro para subprocesos al no utilizar ningún nivel de instancia cosas?

Sin embargo, no veo la forma de gestión de transacciones de primavera encaja aquí. Me refiero a un resorte que proporciona unos gestores de transacciones, es decir, DataSourceTransactionManager JtaTransactionManager, HibernateTransactionManager todo esto es acerca de la persistencia de base de datos. ¿Qué va a configurar para este correo electrónico enviar?

Creo que, en primer lugar las que debe mostrar por qué se preocupan por el hilo de seguridad en el primer lugar. Lo más probable es que le gustaría mostrarnos algunos fragmento de código o algo relevante. Entonces podríamos ser capaces de sugerir algo.

[Adición]

Cuando se generaba un subproceso por cada llamada a ese método y no usar nada del estado, entonces ¿por qué usted quiere hacer el método synchronized. Haciendo el método sincronizado no limitará el número de hilos de ninguna manera. Es posible que haya posibilidad de que antes de iniciar un nuevo hilo, hilo anterior podría haber terminado el trabajo, debido a la sincronización. El proceso de generar un subproceso podría ir más lento.

Sin embargo, hay que ir con esto hasta que se entera de que en realidad hay muchos hilos de ejecución y se van fuera de la memoria. Y si realmente quiere hacer frente a que antes de tiempo, entonces usted debe elegir algún tipo de mecanismo de bloqueo, algo así como semáforo .

Otros consejos

Otra posibilidad sería el uso de colas JMS y poner el código de envío de correo electrónico en un bean controlado por mensajes (o hasta la primavera JMS). A continuación, puede utilizar el servidor de aplicaciones para controlar cómo se utilizarán muchos casos concurrentes de su MDB y estrangular a los correos electrónicos salientes de esa manera.

3.0 en Sping puede utilizar @Async anotación a hacer ejecución de la tarea, por lo que su método se ejecutará más tarde y el método se devuelve directamente sin tener que esperar para el correo electrónico para ser enviados.

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

A continuación, en el contexto de aplicación especifica y no se olvide de añadir xmlns para el esquema de tareas.

Si desea retrasar la ejecución de cierta cantidad de tiempo, es posible utilizar la anotación @Scheduled a su método.

Además tutorial sobre @Async y @Scheduled se puede encontrar aquí:

http: // Blog .springsource.com / 2010/01/05 / task-programación-simplificaciones dentro de muelle-3-0 /

No estoy seguro de si responde a su pregunta, pero en lugar de crear un nuevo hilo para cada correo y llamar inicio en él que pudiera tener un Ejecutor o ExecutorService como miembro de la clase, como una implementación podría usar un ThreadPoolExecutor con un tamaño de la piscina 1. Su método sendMail haría a continuación, enviar Runnables al ejecutor.

Primavera @Transactional no es del todo correcto utilizado en su caso. La mejor apuesta está utilizando el método synchorized y añadir un poco de hilo de puesta en común si su método llamado por el tiempo cientos. Pero supongo que no necesita grupo de subprocesos aquí.

Si utiliza hilo para enviar correo electrónico explosión, entonces lo que está sincronizando señalar el método? si uno proceso de llamar a su método y enviar correo electrónico, otro proceso le llamará método aún el primer proceso de envío de correo electrónico no terminar.

Si la intención de estrangular el proceso de envío de correo electrónico, es necesario condider una cola (colección) y proteger la colección con el bloque de sincronización. Crear otro proceso para supervisar esa cola, si hay un elemento en la cola, el pop y enviar correo electrónico explosión, a continuación, esperar a que termine el proceso de enviar correo electrónico y comprobar de nuevo la cola, si hay algún elemento, continúan enviando proceso de correo electrónico. Si no hay ningún elemento en la cola, hacen que el sueño subproceso de supervisión por algún trozo de tiempo, entonces, si el tiempo de sueño es terminar de comprobar la cola de nuevo.

Haga su servicio un singleton y añadir synchronized a su método.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top