사용

2011-09-15 5 views
7

배경을 정지에서 바람둥이를 중지 :사용

나는 WebService를 내부의 레거시 코드의 실행을 직렬화 java.util.concurrent.Executor을 사용해야합니다.

WebService 클래스에 멤버 변수 인 executor를 추가했습니다. 그것은 springframework에 의해 외부에서 주입됩니다.

집행자 빈은 다음과 같이 정의된다

<bean id="riskValueEstimateUpdateExecutor" scope="singleton" 
     class="java.util.concurrent.Executors" 
     factory-method="newSingleThreadExecutor" /> 
  • 톰캣 버전 : 6.0.22
  • Java 버전 : 1.6
  • 스프링 프레임 워크 : 2.5.5

을 문제 :

WS가 예상대로 작동합니다. 우리는 그것을 리눅스 서버에 배포했습니다. 그런 다음 우리는 tomcat stop 스크립트가 더 이상 서비스를 중지 할 수 없음을 알았습니다.

나는 tomcat 인스턴스에 kill -3을 사용합니다. 스레드 덤프에서 다음 줄을 찾습니다.

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

이 문제를 어떻게 해결할 수 있습니까?

자세한 정보가 필요하면 제안하십시오.

답변

8

Tomcat이나 Spring의 잘못이 아닙니다. ExecutorService을 올바르게 종료하면됩니다. 빈 정의에 destroy-method을 추가

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

BTW singleton 범위가 기본값입니다. shutdownNow() 방법을 사용해보십시오. 또한 Spring은 강력한 task scheduling 메커니즘을 제공합니다.

+0

이것은 tomcat/java/spring env에서 실행 프로그램을 사용하는 것이 맞습니까? – Dejell

5

스프링 컨텍스트가 종료되면 shutdown을 호출하는 방법을 찾아야합니다. 빈 destroy-method 속성을 사용하고 shutdown으로 설정하십시오. 다음과 같은 것 :

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

당신의 대답은 그만큼 좋습니다! 나는 당신의 대답도 받아 들일 수 있기를 바랍니다. –

+0

어떻게 스레드 양을 설정합니까? – Dejell

+0

다른 실행 프로그램 사용 : newSingleThreadExecutor는 정의에 따라 단일 스레드입니다. 대안에 대해 java.util.concurrent.Executors를 체크 아웃하십시오. – Femi