2009-11-25 21 views
5

Tengo aplicaciones web basadas en servlets de Java. Me gustaría implementar algunas operaciones de manera asincrónica, como por ejemplo escribir en un registro.La manera más fácil de realizar operaciones asíncronas en aplicaciones web Java

Me gustaría evitar la sobrecarga de JMS y hacer algo simple.

Administrar hilos por mi cuenta no parece una buena idea en un entorno de servidor, probablemente necesite acceder al grupo de subprocesos del servidor, etc. ¿Cuál es la mejor alternativa para el funcionamiento asincrónico simple?

Editar:

Sólo una aclaración, ya que muchos sugirieron usar log4j u otra biblioteca de registro, escribiendo a una operación de registro es aquí más de un ejemplo. Estoy interesado en cómo realizar de forma asíncrona cualquier operación que no deba realizarse de forma secuencial. Idea es responder al usuario de inmediato y continuar procesando operaciones costosas en otro hilo.

En lo que respecta al problema de registro, tenemos un registro de auditoría que implementamos para escribir una gran cantidad de datos en una base de datos y es utilizado por el usuario durante las operaciones de auditoría y en el servicio de asistencia. Escribir mucha información a DB puede ser muy costoso. Usamos log4j para el registro del sistema y dado que el appender es un apéndice de archivos, no tenemos problemas de rendimiento con nuestro registro del sistema.

+0

Bueno ... ¿necesita la ejecución garantizada de la operación asincrónica o está bien si no se ejecuta si, por ejemplo, el servidor se reinicia? Gran parte de la complejidad de JMS proviene de ofrecer recuperación en tales situaciones. – meriton

+0

Buena pregunta. Supongo que no necesita estar más "garantizado" de lo que es hoy en día, cuando se realiza sincrónicamente. Por ejemplo, si DB para mi registro de auditoría no está disponible por alguna razón, el error se producirá con la entrada en el registro de mi sistema. El cierre del servidor es un escenario de esquina interesante. Supongo que en ese caso podría decirle a un usuario: corte el tráfico y espere hasta que no haya mensajes en la cola antes de apagar el servidor. Un servlet simple que muestra el conteo de mensajes podría hacer ... – Dan

Respuesta

1

Como mucha gente ha dicho aquí, el registro no es un buen candidato para la asincrónica. Sin embargo, considero que tienes una buena razón para creer lo contrario.

En tal caso, utilizaría una cola (por ejemplo, ConcurrentLinkedQueue), y un subproceso de baja prioridad (que se inicia al inicio de la aplicación y se cancela al apagar, por ejemplo, desde un servlet de ejecución al inicio) . El hilo debe elegir los mensajes de la cola y hacer su escritura. El subproceso debe ser activado por un método notify() o en intervalos iguales.

Riesgo: la cola puede crecer incontrolablemente bajo una carga pesada (ya que el hilo puede no tener suficientes ciclos de CPU).

Existen otras formas de iniciar una operación asíncrona (por ejemplo, Temporizador, Futuro, ...) pero no creo que sean adecuadas para operaciones pequeñas y rápidas.

+1

Otra razón sería reducir el tiempo de operación visible por el usuario al posponer la actividad de registro. En ese caso, de nuevo, coloca los mensajes de registro en Queue, devuelve la página al usuario y luego vacía la cola de registro en el medio (disco, base de datos, registrador de red). El rendimiento total no es más alto, pero la experiencia del usuario es mejor. –

0

Si todo lo que desea hacer es un registro simple, entonces Log4j es fácil y fácil de usar.

+0

No piense que log4j es asíncrono a menos que use un JMS o un appender personalizado :-) – Karl

+2

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j /AsyncAppender.html – ChadNC

0

Si solo está tratando de escribir en un registro de manera asíncrona, lo evitaría por completo y solo utilizaría la salida almacenada en el buffer si fuera necesario.

Nunca lo he usado, pero el proyecto http://mina.apache.org/ de apache tiene buenas críticas, sin embargo, creo que esto es principalmente a nivel de red.

0

Desea realizar operaciones más pesadas asíncronas, no muy ligeras, como el registro. Una vez que formules el mensaje de registro, la escritura real debería ser muy rápido (después de todo, tu controlador de disco también almacena en caché).

Así que si tiene una operación pesada que empantanaría su aplicación web y la haría menos receptiva, generalmente es una buena idea usar un enfoque de cola de mensajes persistente como JMS.

Si desea hacer el registro, sugeriría SLF4J, que es el sucesor de Log4J y muy potente y eficiente.

Si está buscando iniciar sesión en un entorno de varias máquinas, un enfoque es configurar su registrador para escribir mensajes en un grupo de multidifusión, desde donde se leen y escriben en el disco uno o más servidores de agregación de registros.

Cuestiones relacionadas