2011-09-13 2 views
0

인터넷상의 리소스에서 새 메일을 확인하는 응용 프로그램이 있습니다. 새 메일이있는 경우 메일을 처리합니다. 즉, 메일 양에 따라 처리 시간이 몇 초에서 수 시간 정도 걸릴 수 있습니다.작업 예약, 작업 실행 여부 확인

이제 처리를 수행하는 객체/프로그램은 이미 싱글 톤입니다. 그래서 지금 당장 나는 검사와 처리를 다루는 인스턴스가 실제로 오직 하나만 있다는 것을 이미 알고있었습니다.

그러나 지금은 한 번만 실행하고 있으며 10 분마다 새로운 메일을 적시에 확인하여 지속적으로 실행하고 싶습니다.

나는 이것을 Timer/Timertask로 처리 할 수 ​​있다고 생각한다. 또는 여기에서 자원을 찾은 것이 더 좋다 : http://www.ibm.com/developerworks/java/library/j-schedule/index.html이 Scheduler/SchedulerTask를 사용한다. 하지만 내가 두려워하는 것은 매 10 분마다 실행하도록 설정하고 이전 세션이 이미 데이터를 처리하고 있다면 이전 작업이 완료되면 실행 대기중인 스택에 새 작업을 넣을 것입니다. 그래서 내가 두려워하는 것은 예를 들어 5 시간 동안 실행 된 첫 번째 실행이고, 그 이후로는 계속 바쁘기 때문에 5 * 6-1 = 29가 실행되고 메일과/서버에 휴식을주지 않고 일부 처리를 수행하십시오.

아무도 내가 이것을 해결할 수있는 방법을 알고 있습니까?

P. 내가 지금 내 응용 프로그램을 설정하는 방법은 서버에서 시작된 내 Tomcat 서버에서 자바 서블릿을 사용하여 메인 프로그램의 Singleton 인스턴스를 만든 다음 가져 오기/처리를 수행 할 메소드를 호출하는 것입니다. 그리고 내가 원하는 것은 모든 "x"시간 (10 분 정도)을 가져 오거나/처리하는 것을 반복하는 것입니다. 실제로는 단지 1 개의 인스턴스가이를 수행하고 있으며, 실제로는 10 분마다 실행됩니다.

+0

왜 이벤트 기반 접근 방식을 시도하지 마십시오. 그래서 스케줄러 클래스는 가변적 인 시간이 걸리는 작업을 시작합니다; 이 태스크를 시작하는 동안 프로세스 완료 이벤트를 수신하는 리스너도 등록합니다. 이제 변수 내구성의 메일 처리 작업이 완료되면 스케줄러에 통지됩니다. 스케줄러는 10 분 후에 다른 작업을 트리거하도록 대기열에 넣을 수 있습니다. 또한 불필요한 작업이 작업 대기열에 대기되지 않도록합니다. – Scorpion

답변

1

실제로 Timer + TimerTask는이 문제를 상당히 깨끗하게 처리 할 수 ​​있습니다. Timer.scheduleAtFixedRate()으로 일정을 잡는다면 장기 실행 기간을 유지하기 위해 늦은 이벤트를 "보충"하려고 할 것입니다. 그러나 이것은 TimerTask.scheduledExecutionTime()을 사용하여 극복 할 수 있습니다. 여기에있는 예제를 사용하면 작업이 너무 느려서 실행할 수 있는지 파악할 수 있으며 아무 것도하지 않고 돌아갈 수 있습니다. 실제로 이것은 TimerTask의 "대기열 지우기"입니다.

참고 : TimerTask는 실행시 단일 스레드를 사용하므로 작업을 나란히 두 개 생성하지 않습니다.

사이드 노트 부분에서는 대기열에있는 모든 10k 이메일을 한 번에 처리 할 필요가 없습니다. TimerTask.scheduledExecutionTime()을 사용하여 고정 된 시간 동안 처리하여 시간을 파악한 다음 반환하는 것이 좋습니다. 이렇게하면 프로세스가 더 유연 해지고 실행 사이에 스택을 정리할 수 있으며 집계를 수행하는 경우 예를 들어 서버가 작업 중간에 다시 시작되는 경우 너무 많은 데이터를 다시 작성할 필요가 없습니다. 그러나이 권장 사항은 작업에서 수행중인 작업을 모르기 때문에 일반성을 기반으로합니다.