2013-01-22 3 views
2

저는 스프링 MVC 애플리케이션으로 구현 된 플러그인을 만들고 있습니다. 이 플러그인은 서버 중 하나에서 GUI를 통해 3 - 6 개의 Tomcat 서버에 배포됩니다. 각 플러그인 인스턴스에는 @Scheduled 메소드가있어 서버에 대한 정보를 수집하여 중앙 데이터베이스에 저장합니다.서버에서 @Scheduled 스레드를 안전하게 제거하는 방법은 무엇입니까?

내 문제는 플러그 인을 제거하기위한 gui 인터페이스가 @Scheduled 스레드 중 일부를 실행 중으로 남겨 둡니다.

예를 들어 서버 1 - 3이있는 환경이 있습니다. 서버 1의 gui를 통해 플러그인을 설치하고 활성화합니다. 이제 응용 프로그램의 인스턴스가 서버 1 - 3에 @Scheduled 스레드를 실행합니다. 난 다시 서버 1로 가서 플러그인을 제거, 스레드가 안정적으로 서버에 하나 개가 아니라 서버 2 또는 3

나는 다음과 같은 구현했습니다 살해되지만 동작이 계속 :

@Component 
public class ContextClosedListener implements ApplicationListener<ContextClosedEvent> { 
    @Autowired 
    ThreadPoolTaskExecutor executor; 

    @Autowired 
    ThreadPoolTaskScheduler scheduler; 

    public void onApplicationEvent(ContextClosedEvent event) { 
     scheduler.shutdown(); 
     executor.shutdown(); 
    } 
} 

을 추가, 나는 이것을 @Scheduled 메소드가 아닌 컨텍스트 리스너로 구현하려고 생각했지만, 유지 보수와 extech를 위해 Spring을 고집하고자한다. 불가항력적인 이유.

어떻게 이런 환경에서 스레드를 안정적으로 제거 할 수 있습니까?

답변

0

나는 몇 가지 생각이 있습니다. ThreadPoolTaskExecutor에는 스레드의 접두사를 설정할 수있는 setThreadNamePrefix 메소드가 있습니다. 접두어를 고유 한 것으로 설정 한 다음 런타임에 해당 스레드를 찾아서 종료 할 수 있습니다. 동일한 객체에 대해 setThreadGroup 메소드를 사용하여 스레드 그룹을 설정 한 다음 스레드 그룹에서 스레드를 중지 할 수도 있습니다.

더 좋고 더 안전한 솔루션은 예약 된 작업에 브레이크 아웃 방법을 만드는 것입니다. 이것은 Thread.stop()을 호출하는 오래된 "shot it in the head"메소드 대신에 Thread를 멈추는 데 선호되는 메소드입니다. 공통의 접두사를 설정하거나 위에 설명 된 스레드 그룹을 사용하여 해당 실행 파일에 대한 참조를 얻을 수 있습니다.

다음 질문은 어떻게 스레드를 쉽게 멈 춥니 까? 이를 위해서는 응용 프로그램을 구현하는 방법에 따라 달라집니다. 주로 Spring MVC 애플 리케이션을 다루기 때문에, 나의 첫 번째 해결책은 관리자 작업을 처리하기 위해 컨트롤러를 작성하는 것이다. 이것이 JBoss 나 JMX를 가지고있는 다른 대형 어플리케이션 서버 (Tomcat이 JMX를 제공하도록 구성 될 수 있다고 믿습니다.하지만 상자 밖에서 구성된 것처럼 생각하지는 않습니다)라면 JMX 사용 가능 bean을 앱 서버 콘솔을 통해 스레드를 중지하도록 허용합니다. 기본적으로 스레드의 중지를 트리거하는 메소드를 제공하십시오.

관련 문제