2012-03-25 18 views
5

Estamos creando una aplicación web en la que necesitamos concurrencia para algunos casos comerciales. Esta aplicación se implementaría en un contenedor Tomcat. Sé que la creación de subprocesos definidos por el usuario en el contenedor web es una mala idea y estoy tratando de explorar las opciones que tengo.Implementación de concurrencia en la aplicación web Java EE

  1. Haga que mi biblioteca multiproceso se utilice como un componente JCA. Somos reacios a utilizar este enfoque debido a la curva de aprendizaje que podría estar involucrada.
  2. Sé que hay API de WorkManager disponible, pero supongo que eso no está implementado por tomcat, por lo que esta opción se apaga.
  3. Hice algunas investigaciones y descubrí que se recomienda la biblioteca CommonJ para Tomcat. ¿Alguien lo ha usado?
  4. Además, veo que hay ManagedExecutorService disponible, pero no estoy seguro de cómo usarlo y ¿es diferente de la API de WorkManager (y de la biblioteca commonJ)?

Cualquier ayuda sobre esto apreciada. Por cierto, el uso de JMS está fuera de toda duda debido al entorno de despliegue. Me inclino por los puntos 3 y 4, pero no tengo mucho conocimiento al respecto. Podría alguien guiar a los pls.

Respuesta

4

Dado que está utilizando Tomcat, no se preocupe y haga lo que desee. La sección Servlet de Java EE no hace mención de hilos, etc. Eso es principalmente bajo la sección EJB.

Tomcat en sí no hace mucho en términos de preocuparse por la gestión de los hilos, es un contenedor bastante no invasivo.

Lo mejor es conectar sus hilos a un ServletContextListener para que pueda prestar atención al ciclo de vida de la aplicación, y apagar sus cosas cuando la aplicación se apaga, pero más allá de eso, no se preocupe demasiado por eso y use lo que sea estoy contento con.

Adenda -

La simple verdad es Tomcat no le importa, y que no es tan sofisticado. Tomcat tiene un grupo de subprocesos para cada uno de los oyentes HTTP y eso es casi el final de su nivel de gestión. Tomcat no va a tomar los hilos de un oyente HTTP silencioso y dedicarlos a uno ocupado, por ejemplo. Si Tomcat estaba realmente interesado en cómo crear subprocesos, le impediría hacerlo, y no es así.

Eso significa que la gestión de subprocesos fuera del contexto HTTP recae directamente sobre sus hombros como implementador. Java EE expone este tipo de instalaciones, y las interfaces hacen grandes lecturas. Pero la verdad es que las capacidades teóricas expuestas por los documentos de la API de Java EE y la realidad de las implementaciones modernas son muy diferentes, particularmente en sistemas de gama baja como Tomcat.

Para no menospreciar Tomcat. Tomcat es una gran pieza de software. Pero para la mayoría de sus casos de uso, la capacidad de gestión adicional simplemente no es necesaria.

Configurar su propio grupo de subprocesos (utilizando las instalaciones proporcionadas por JDK) y trabajar con su propio modelo de ciclo de vida de subprocesos probablemente lo verá con éxito en cualquier proyecto en el que esté trabajando. Realmente no es un gran problema.

+0

No estoy seguro de que los hilos de desove sean una buena idea. si tomcat no conoce los hilos, ¿cómo lo controlaría? p.ej. cerrar el contenedor sería un problema si los subprocesos se están ejecutando y tampoco hay que olvidar que, dado que los hilos están fuera del control de tomcat, los hilos estarán compitiendo con Tomcat por la memoria. – arya

+0

Arya, Will tiene razón, administre sus propios hilos y (confíe en mi dolor) no vaya por la ruta EJB/JCA. El hecho de estar en un contenedor Servlet no cambia la necesidad de controlar su grupo de subprocesos. El servicio de Ejecutor puede ayudarlo fácilmente a hacer esto. Al vincular el ciclo de vida de sus ejecutores con el de sus servlets, garantiza una inicialización y un apagado limpios. –

+0

BGR, ¿tienen alguna idea sobre ManagedExecutorService? ¿Sería eso más apropiado en este contexto? – arya

0

Cada componente base Servlet -Java EE para el procesamiento de solicitudes HTTP en su aplicación web es un Singleton, y cada solicitud se ejecuta en su propio hilo independiente por lo que no es necesario iniciar/detener hilos generados por el usuario. Su contenedor web, en este caso Tomcat, gestiona todo eso.

Además de eso, debe tener en cuenta algunas consideraciones para el procesamiento de subprocesos múltiples en su código. Por ejemplo, como los Servlets son singleton y se generan muchos hilos para esta clase, es una mala idea tener atributos de instancia en estos componentes.

+0

carlos, en realidad mi pregunta es en una dirección totalmente diferente. Lo que está sugiriendo es el concepto básico de proceso http y esto lo sé. pero hay situaciones en las que hay procesos de negocios invocados por el usuario que toman tiempo y esto se hace a través de hilos. la solicitud http solo invocará el proceso de múltiples hilos ... el resto del proceso sucederá simultáneamente por hilos ... estos hilos en este momento son hilos definidos por el usuario con los que no me siento cómodo. Alguna idea de cómo podría eliminar el uso de estos hilos definidos por el usuario. – arya

1

Hay un par de opciones. Independientemente de las restricciones de los contenedores que podrían estar o no en su lugar, engendrar hilos individuales a pedido es casi siempre una mala idea. No es que esto no funcione en un entorno Servlet, pero la cantidad de subprocesos que potencialmente se pueden crear podría quedar completamente fuera de control.

La solución más simple es un antiguo grupo de subprocesos Java SE simple a través de un servicio de ejecución normal. Inicie el grupo en un oyente Servlet y proporcione acceso a él a través de una variable estática. No demasiado bonito, pero hace el trabajo bien. Dependiendo de su caso de uso exacto, esta podría ser la mejor solución (si su caso de uso es bastante bajo).

Otra opción es agregar OpenEJB a su guerra, y luego tomar ventaja de la anotación @Asynchronous.

Otra opción más, es darse cuenta de que uno normalmente utiliza Tomcat si los requisitos del negocio son extremadamente simples o de bajo nivel. Ese es casi todo el punto de usar algo como hueso desnudo un Tomcat. Tan pronto como tenga la necesidad de agregar (toneladas de) bibliotecas, es posible que haya superado a Tomcat y que sea mejor utilizar un servidor que ya tenga la funcionalidad que necesita (en este caso, la ejecución asincrónica). Ejemplos son TomEE, GlassFish, Resin, JBoss AS, Geronimo, etc.

+0

Arjan, en realidad el servidor tendría mucha carga en él. no demasiados usuarios concurrentes, sino muchos usuarios que continúan hablando con algunas conversaciones de larga duración (no necesariamente conversaciones transaccionales). ¿diría usted que Tomcat sería lo suficientemente bueno para nuestro requerimiento? – arya

+0

Solía ​​trabajar para un proveedor de software como servicio que usaba numerosos clústeres Tomcat para manejar aplicaciones que manejaban decenas de millones de vistas de página por mes por clúster. Existe un concepto erróneo entre mucha gente de que Tomcat es solo para proyectos pequeños, pero eso no es cierto. –

+0

Número de vistas no es lo que quise decir con simple o pequeño realmente. Si el código es simple, en el sentido de que no necesita una IU, ORM, etc., básicamente su código es de "bajo nivel" y, por supuesto, el código de bajo nivel ejecuta millones de visitas (teníamos una parte de nuestro la aplicación que se ejecuta en Tomcat puede fácilmente con dos dedos en la nariz hacer 6000 transacciones/segundo/servidor, pero básicamente todo esto fue aceptar solicitudes HTTP, poner cosas en algunas colas de transferencia y eventualmente persistir en lotes para el DB, un par de mil LOC max) –

0

He usado CommonJ muchas veces y funciona muy bien. Se puede inicializar y destruir desde un ServletContextListener.

+0

gracias por la respuesta christian, finalmente tengo a alguien con experiencia en CommonJ. entonces mi primera pregunta es que cuando uso CommonJ, los hilos que se crearían, ¿controlarían Tomcat? Espero que sea bastante escalable .... ¿lo recomendaría para su experiencia en cargas moderadamente pesadas? – arya

Cuestiones relacionadas