Tomcat 5.5, concurrencia y servicios web
Publicado por Adrián Rober (1 intervención) el 24/05/2007 20:19:27
Hola a todos, me gustaría saber que opináis al respecto de un problema que me ha surgido con Tomcat:
Desde un script en PHP quiero llamar a un servicio web que corre sobre Tomcat 5.5 (usando Axis2) y, dado que me es necesario que el PHP siga a lo suyo, hago que el servicio web se ocupe de crear un thread que realmente haga toda la faena. De este modo me aseguro que el servicio web acabe enseguida, devolviendo un resultado cualquiera a la llamada recibida desde el PHP y así poder proseguir con su ejecución y mostrar la página al usuario.
El problema viene cuando dos usuarios de forma simultánea ejecutan dicho script PHP. Parece ser que Tomcat atiende la primera petición recibida usando su pool de threads convenientemente, ejecutando el servicio web que a su vez crea el thread que "realmente trabaja". Sin embargo, puesto que el servicio invocado acaba enseguida, parece ser que Tomcat lo marca es su pool como thread libre y al llegar la segunda petición se reaprovecha dicho hilo, eliminando el thread "trabajador" que estaba realizando las tareas "pesadas" sin darle la posibilidad de acabar.
¿Os parece posible que Tomcat elimine un thread en ejecución (en este caso se trata del thread "trabajador") al querer reaprovechar la posición del pool desde la que se creó dicho thread? Por una parte me parecería razonable que fuera así para asegurarse que no queden hilos colgados sin acabar.
Si tenéis constancia de que verdaderamente sea así, ¿podéis darme alguna idea sobre cómo podría hacer llamadas asíncronas a servicios web desde un script PHP? ¿Qué debería hacer con el servicio web? ¿Hay algo que se pueda hacer con Tomcat para que no actúe de este modo?.
Un saludo y gracias de antemano.
Adri
Desde un script en PHP quiero llamar a un servicio web que corre sobre Tomcat 5.5 (usando Axis2) y, dado que me es necesario que el PHP siga a lo suyo, hago que el servicio web se ocupe de crear un thread que realmente haga toda la faena. De este modo me aseguro que el servicio web acabe enseguida, devolviendo un resultado cualquiera a la llamada recibida desde el PHP y así poder proseguir con su ejecución y mostrar la página al usuario.
El problema viene cuando dos usuarios de forma simultánea ejecutan dicho script PHP. Parece ser que Tomcat atiende la primera petición recibida usando su pool de threads convenientemente, ejecutando el servicio web que a su vez crea el thread que "realmente trabaja". Sin embargo, puesto que el servicio invocado acaba enseguida, parece ser que Tomcat lo marca es su pool como thread libre y al llegar la segunda petición se reaprovecha dicho hilo, eliminando el thread "trabajador" que estaba realizando las tareas "pesadas" sin darle la posibilidad de acabar.
¿Os parece posible que Tomcat elimine un thread en ejecución (en este caso se trata del thread "trabajador") al querer reaprovechar la posición del pool desde la que se creó dicho thread? Por una parte me parecería razonable que fuera así para asegurarse que no queden hilos colgados sin acabar.
Si tenéis constancia de que verdaderamente sea así, ¿podéis darme alguna idea sobre cómo podría hacer llamadas asíncronas a servicios web desde un script PHP? ¿Qué debería hacer con el servicio web? ¿Hay algo que se pueda hacer con Tomcat para que no actúe de este modo?.
Un saludo y gracias de antemano.
Adri
Valora esta pregunta
0