2011-09-15 12 views
7

Tło:Zastosowanie java.util.concurrent.Executor zatrzymuje Tomcat od zatrzymania

muszę korzystać java.util.concurrent.Executor do serializacji wykonanie niektórych starszych kod wewnątrz WebService.

Dodałem zmienną składową, executor, do klasy WebService. Jest on wtryskiwany z zewnątrz przez ramę sprężystą.

Wykonawca fasoli jest zdefiniowany w następujący sposób:

wersji
<bean id="riskValueEstimateUpdateExecutor" scope="singleton" 
     class="java.util.concurrent.Executors" 
     factory-method="newSingleThreadExecutor" /> 
  • Tomcat wersja 6.0.22
  • Java framework 1,6
  • wiosenny 2.5.5

Problem:

WS działa zgodnie z oczekiwaniami. Przetworzyliśmy go na serwer linuxowy. Wtedy uświadomiliśmy sobie, że skrypt zatrzymujący tomcat nie może już zatrzymać usługi.

Używam kill -3 do instancji tomcat. W zrzucie wątku znajduję następujące linie:

"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) 

Jak mogę rozwiązać ten problem?

Jeśli potrzebujesz więcej informacji, proszę sugerować.

Odpowiedz

8

To nie jest wina Tomcat ani Spring. Musisz poprawnie zamknąć ExecutorService. Dodaj destroy-method w definicji fasoli:

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

BTW singleton zakres jest domyślna. Możesz także rozważyć użycie metody shutdownNow(). Zauważ również, że Spring zapewnia potężny mechanizm task scheduling.

+0

czy to jest właściwy w użyciu executorów w tomcat/java/spring env? – Dejell

5

Musisz znaleźć sposób, aby zadzwonić pod numer shutdown, gdy kontekst wiosny jest wyłączony: spróbuj użyć właściwości fasoli destroy-method i ustaw ją na shutdown. Coś takiego:

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

Twoja odpowiedź jest równie dobra! Chciałbym również móc przyjąć twoją odpowiedź. –

+0

Jak ustawić ilość wątków? – Dejell

+0

Użyj innego executora: newSingleThreadExecutor jest (z definicji) pojedynczym wątkiem. Zamówienie java.util.concurrent.Executors na alternatywy. – Femi

Powiązane problemy