문제

내 프로그램에는 스케줄러라고 불리는 구성 요소가있어 다른 구성 요소가 다시 호출하려는 시간에 포인트를 등록 할 수 있습니다. 이것은 Unix Cron 서비스와 매우 유사하게 작동합니다. 즉, 스케줄러에게 "1 시간마다 10 분마다 통지하십시오"라고 말합니다.

자바에는 실제 콜백이 없다는 것을 알고 있습니다.

여기 내 접근 방식이 있습니다. 이미이 작업을 수행하는 도서관이 있습니까? 개선을 자유롭게 제안하십시오.

스케줄러 패스에 대한 등록 전화 :

  • 시간, 분, 두 번째, 1 년, DOM, DOW를 포함하는 시간 사양. 각 항목은 지정되지 않을 수 있습니다. (Crontabs처럼)
  • 호출 객체에 스케줄러가 알릴 때해야 할 일을 알려주는 데이터가 포함 된 객체. 스케줄러는이 데이터를 처리하지 않고 저장하고 알림시 다시 전달합니다.
  • 호출 객체에 대한 참조

시작시 또는 새 등록 요청 후, 스케줄러는 현재 시스템 시간의 캘린더 개체로 시작 하여이 시점과 일치하는 데이터베이스에 항목이 있는지 확인합니다. 있으면 실행되고 프로세스가 시작됩니다. 그렇지 않으면 달력 객체의 시간이 1 초 증가하고 앙트레가 다시 확인됩니다. 이것은 일치하는 하나 이상의 항목이있을 때까지 반복됩니다 (ES). (개별 이벤트 시뮬레이션)

그런 다음 스케줄러는 해당 타임 스탬프, 수면 및 깨우기를 기억하여 이미 존재하는지 확인합니다. 그것이 일어나고 시간이 이미 지나면 시간이오고 일자리가 처형 된 경우 마찬가지로 시작됩니다.


편집하다: Quartz를 가리켜 주셔서 감사합니다. 그러나 나는 훨씬 더 작은 것을 찾고 있습니다.

도움이 되었습니까?

해결책

귀하의 요구가 간단한 경우 사용을 고려하십시오 java.util.timer:

public class TimerDemo {

  public static void main(String[] args) {
    // non-daemon threads prevent termination of VM
    final boolean isDaemon = false;
    Timer timer = new Timer(isDaemon);

    final long threeSeconds = 3 * 1000;
    final long delay = 0;
    timer.schedule(new HelloTask(), delay, threeSeconds);

    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.MINUTE, 1);
    Date oneMinuteFromNow = calendar.getTime();

    timer.schedule(new KillTask(timer), oneMinuteFromNow);
  }

  static class HelloTask extends TimerTask {
    @Override
    public void run() {
      System.out.println("Hello");
    }
  }

  static class KillTask extends TimerTask {

    private final Timer timer;

    public KillTask(Timer timer) {
      this.timer = timer;
    }

    @Override
    public void run() {
      System.out.println("Cancelling timer");
      timer.cancel();
    }
  }

}

늘 그랬듯이 유명한,, ExecutorServicejava.util.concurrent 필요한 경우 더 풍부한 API를 제공합니다.

다른 팁

조회 석영

객체가 실행되기를 원하는 시간에 개별 지점을 정확히 알고 있다면 java.util.concurrent.ScheduledExecutorService. 그런 다음 간단한 전화 :

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
long timeToExecute = ... //read from DB? use CronTrigger?
long delayToExecution = timeToExecute - System.currentTimeMillis();
scheduler.schedule(aRunnable, delayToExecution, TimeUnit.MILLISECONDS);

당신은 만 사용하면됩니다 Quartz 스케줄러 자체가 "5 초마다 실행"과 같은 기능을 처리하거나 누락 된 실행에 대한 복잡한 동작 또는 실행 감사 트레일의 지속성을 원한다면.

실제로 쿼츠를 사소하게 재사용 할 수 있습니다 CronTrigger "다음 실행 시간"을 얻는 클래스. 클래스는 완전히 독립형이며 내에서 호출되는 것에 의존하지 않습니다. Quartz "문맥". 다음 실행 시간이 있으면 Date 또는 long, 당신은 Java 만 사용할 수 있습니다 ScheduledExecutorService 위와 같이

석영 이 지역의 크고 명백한 강국이지만 탐험 할 대안이 있습니다.

cron4j 괜찮은 라이브러리이며, 쿼츠보다 약간 더 가볍습니다. 그것은 좋은 문서를 제공하고 당신이 원하는 것을 할 것입니다.

아마도 더 흥미로울 것입니다. Java의 동시 도서관 (특히 집행자 및 스케줄링 퇴적 자)에 더 잘 맞는 라이브러리를 사용하려는 경우 HA-JDBC a cronexecutorservice 인터페이스, ITS에 의해 구현되었습니다 Cronthreadpoolexecutor. 흥미롭게도, 그것은 쿼츠에 의존하고 (cronexpression 클래스를 제공하기 위해), 나는 두 사람이 함께 쿼츠만으로 더 잘 작동한다는 것을 알았습니다. 큰 의존성을 원하지 않는다면, Quartz와 HA-JDBC에서 소수의 클래스를 쉽게 추출하여 이런 일이 발생합니다.

훨씬 더 작은 것을 원하기 때문에 (편집을 보았습니다), Quartz의 Cronexpression과 위에서 언급 한 두 HA-JDBC 클래스를 잡으십시오. 그렇게 할 것입니다.

강력히 추천합니다 cron4j (이미 언급) 쿼츠를 통해 쿼츠의 고급적이고 복잡한 특징이 절대적으로 필요하지 않는 한. CRON4J는해야 할 일에 중점을두고, 괜찮은 문서를 가지고 있으며, 주방 싱크 솔루션이 아닙니다.

석영 스케줄러 일반적으로 권장됩니다.

java.util.timer가 답으로 선정되었다고 믿을 수 없습니다. 석영은 훨씬 더 나은 선택입니다.

java.util.timer에 대한 석영의 가장 큰 장점은 쿼츠를 사용하면 작업이 DB에 저장 될 수 있다는 것입니다. 결과적으로 한 JVM이 예약 할 수 있고 다른 JVM이 실행할 수 있습니다. 또한 (분명히) 요청은 JVM 재시작에서 살아남습니다.

아마도 더 흥미로운 것은 아마도 Java의 동시성 라이브러리 (특히 집행자 및 스케줄 예시)에 더 잘 맞는 라이브러리를 사용하려면 HA-JDBC에는 Cronthreadpoolexecutor가 구현 한 cronexecutorservice 인터페이스를 가지고 있습니다. 흥미롭게도, 그것은 쿼츠에 의존하고 (cronexpression 클래스를 제공하기 위해), 나는 두 사람이 함께 쿼츠만으로 더 잘 작동한다는 것을 알았습니다. 큰 의존성을 원하지 않는다면, Quartz와 HA-JDBC에서 소수의 클래스를 쉽게 추출하여 이런 일이 발생합니다.

방금이 수업을 추출하려고했다고 말하고 싶었고 효과가있었습니다! 이 세 가지 수업이 필요했습니다.

  • cronexpression (quartz)
  • Cronthreadpoolexecutor (HA-JDBC)
  • daemonthreadfactory (ha-jdbc)

그리고 나는이 사소한 조정을해야했습니다.

  • Cronthreadpoolexecutor에서 로거 제거 (생성되었지만 사용되지 않았습니다)
  • contant lecontrigger에서 cronexpression으로 Constant Year_to_giveUp_scheduling_at를 이동했습니다

나는 의존성의 엉킴을 잡아 당기지 않았다는 것에 감격했다. 수업 작가들에게 축하드립니다!

그리고 그것은 챔피언처럼 일하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top