2013-02-20 5 views
1

Tomcat에서 실행중인 서블릿에서 22 분마다 메소드를 실행하려고합니다. 그래서 나는이 코드를 사용하고 있습니다 :이 내가 오류를 타이머에 관한 모든 시간을 얻고로 할 수있는 끔찍한 방법입니다 느낌이있어타이머가 Tomcat 서버에서 문제를 일으킬 때

Timer timer = new Timer(); 

timer.schedule(new TimerTask() { 
    @Override 
    public void run() { 

     try { 
      update(); 
     } catch (SQLException | NamingException | InterruptedException e1) { 
      e1.printStackTrace(); 
     } 
    } 
}, 22 * 60 * 1000, 22 * 60 * 1000); 

을 때마다 나는의 새 버전을 업로드 서블릿 이전 타이머가 멈추지 않는다고 생각합니다. 그런 다음 데이터베이스 연결 경고를받습니다. 내가 모든 것을 다시 시작하고 신선한 것을 시작하면.

javax.naming.NameNotFoundException: Name comp is not bound in this Context 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:770) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:153) 
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:152) 
    at javax.naming.InitialContext.lookup(InitialContext.java:411) 
    at my.app.database.DatabaseManager.connect(DatabaseManager.java:44) 
    at my.app.database.DatabaseManager.returnInfo(DatabaseManager.java:133) 
    at my.app.genParse.Generate.updateHistory(Generate.java:89) 
    at my.app.MyServer$1.run(MyServer.java:52) 
    at java.util.TimerThread.mainLoop(Timer.java:555) 
    at java.util.TimerThread.run(Timer.java:505) 

또한 새로운 버전으로 재 출시에

:

SEVERE: The web application [/myApp] appears to have started a thread named [Timer-7] but has failed to stop it. This is very likely to create a memory leak. 

무슨 달성하거나이를 방지 할 수있는 더 좋은 방법?

답변

1

타이머 작업을 사용하는 대신 here이 논의되었습니다. ScheduledThreadpoolExecutor 클래스 MAY을 사용하면 새 버전을 업로드 할 때 여러 스레드가 계속 실행되는 문제에 도움이되지만 확실하게 말할 수는 없습니다. 이 클래스는 javadoc에서 논의 된 여러 가지 이유로 Timer 클래스보다 선호됩니다.

+0

감사합니다. 지금 사용하고 있으며 더 잘 돌아가고있는 것으로 보입니다. – RegDHunter

1

컨테이너 내에서 Timer을 실제로 사용하면 안됩니다. - Timer 컨테이너 외부에서 관리되는 스레드를 재사용하면 문제가 발생할 수 있습니다.

또한 Timer은 하나의 인스턴스가 너무 오래 걸리는 경우 하나의 스레드를 사용하므로 정확도가 떨어질 수 있습니다.

마지막으로 Timer이 검사되지 않은 예외를 throw하면 Timer 스레드가 종료됩니다.

이러한 이유로 (그리고 다른 이유로) 크게 선호되지 않아서 ScheduledThreadPoolExecutor가 더 나은 선택입니다.

다시 말해서 컨테이너 내의 사용자 관리 스레드는 까다로울 수 있습니다. JSR-236 (Java EE 플랫폼의 동시성 유틸리티)은 앞으로도 그렇게 할 수있는 메커니즘을 제공 할 것이지만 지금은이를 피하는 것이 가장 좋습니다.

당신은 때 웹 응용 프로그램이 시작과 정지를 시작하고 타이머를 중지하려면 ServletContextListener를 사용 아마도 그 차례 정기적으로

0

에 전용 서블릿 (또는 유사)를 호출 할 수 크론을 통해 일정 반복 작업을 시도 할 수 있습니다.

관련 문제