2011-09-15 3 views
7

Antecedentes:El uso de java.util.concurrent.Executor detiene Tomcat se detenga

necesito utilizar java.util.concurrent.Executor para serializar la ejecución de un código legado dentro de un servicio Web.

He agregado una variable miembro, ejecutor, a la clase WebService. Se inyecta desde el exterior por el marco de la primavera.

El grano ejecutor se define como tal:

versión
<bean id="riskValueEstimateUpdateExecutor" scope="singleton" 
     class="java.util.concurrent.Executors" 
     factory-method="newSingleThreadExecutor" /> 
  • Tomcat: versión 6.0.22
  • Java: marco 1.6
  • primavera: 2.5.5

Problema:

El WS funciona como se esperaba. Lo lanzamos a un servidor de Linux. Entonces nos dimos cuenta de que el script stop de tomcat ya no podía detener el servicio.

Utilizo kill -3 para la instancia de tomcat. En el volcado de hilo encontré estas líneas:

"pool-2-thread-1" prio=10 tid=0xad637c00 nid=0xf37 waiting on condition [0xae882000..0xae883020] 
    java.lang.Thread.State: WAITING (parking) 
     at sun.misc.Unsafe.park(Native Method) 
     - parking to wait for <0xb453b710> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
     at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158) 
     at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1925) 
     at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:358) 
     at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:946) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:906) 
     at java.lang.Thread.run(Thread.java:619) 

¿Cómo puedo solucionar este problema?

Si necesita más información, por favor sugiera.

Respuesta

8

No es culpa de Tomcat ni de Spring. Solo tiene que cerrar ExecutorService correctamente. Añadir destroy-method en la definición de frijol:

<bean id="riskValueEstimateUpdateExecutor" scope="singleton" 
    class="java.util.concurrent.Executors" 
    factory-method="newSingleThreadExecutor" destroy-method="shutdown"/> 

Por cierto singleton ámbito de aplicación es por defecto. También puede considerar usar el método shutdownNow(). También tenga en cuenta que Spring proporciona el poderoso mecanismo task scheduling.

+0

¿Es este el correcto de usar ejecutores en tomcat/java/spring env? – Dejell

5

Debe encontrar la forma de llamar al shutdown cuando se cierra el contexto de Spring: intente con la propiedad bean destroy-method y configúrelo en shutdown. Algo como esto:

<bean id="riskValueEstimateUpdateExecutor" scope="singleton" 
     class="java.util.concurrent.Executors" 
     factory-method="newSingleThreadExecutor" destroy-method="shutdown" /> 
+0

¡su respuesta es igual de buena! Ojalá pueda aceptar tu respuesta también. –

+0

¿cómo configuro la cantidad de subprocesos? – Dejell

+0

Utilice un ejecutor diferente: newSingleThreadExecutor es (por definición) un hilo único. Checkout java.util.concurrent.Executors para alternativas. – Femi

Cuestiones relacionadas