2012-10-24 2 views
0

콩을 실행하기 위해 완전한 웹 응용 프로그램을 배포하고 실행하지 않고 main() 메서드에서 일부 스프링 빈을 실행하기위한 미니 프레임 워크를 만들었습니다. 그것은 다음과 같습니다Spring 컨텍스트를 사용하는 명령 줄 응용 프로그램이 전혀 종료되지 않습니다.

public abstract class BaseLauncher { 

    private static final String APP_CONTEXT_PATH = "com/project/dev/launchers/launchersApplicationContext.xml"; 
    static ApplicationContext context = new ClassPathXmlApplicationContext(APP_CONTEXT_PATH); 

    protected void launch() { 
     context.getBean(getClass()).perform(); 
     //The process never ends so we want to know when we can kill it 
     System.out.println("launcher finished"); 
    } 

    @Transactional 
    abstract protected void perform(); 

} 

그리고 예를 들어 실행은 다음과 같습니다

@Component 
public class ParamLoaderLauncher extends BaseLauncher { 
    @Inject 
    ParamLoader paramLoader; 

    public static void main(String[] args) { 
     new ParamLoaderLauncher().launch(); 
    } 

    @Override 
    protected void perform() { 
     paramLoader.loadParams(); 
    } 
} 

그것은 모두가 호출 된 빈 메소드가 완료되면, 응용 프로그램 만 계속 실행 것을 제외하고 잘 작동하고 우리가 그것을 죽일 필요 수동으로. 나는 그것이 스프링 애플 리케이션 컨텍스트를 사용하는 것과 관련이 있다고 생각한다. 아마도 특별한 스프링 관련 non-deamon 쓰레드가 시작되었을지도 모르겠다. 그렇다면, 그것을 죽일 방법이 있습니까? 아니면 이와 같은 간단한 코드에 다른 원인이있을 수 있습니까?

답변

3

독립 실행 형 응용 프로그램 (컨테이너에서 실행되지 않음)의 경우 응용 프로그램이 종료 될 때 스프링 컨테이너의 완전 종료를 위해 shutdownhook needs to be registered.

관련 문제