SpringBoot 정시 작업 두 가지(Spring Schedule 및 Quartz 통합) 구현 방법

4700 단어 springboot정시
앞말
최근 프로젝트에서 정시 임무를 사용하기 전까지는 Quartz를 사용해 왔다. 최근 스프링의 기초를 보면 스프링이 스프링 스케줄을 제공하면 간단한 정시 작업 기능을 실현할 수 있다는 것을 발견했다.
다음은 Spring Boot 프로젝트에서 사용되는 두 가지 방법에 대해 설명합니다.
Spring Schedule 정시 작업 수행
Spring Schedule은 두 가지 방법으로 정시 작업을 수행합니다. 1.XML을 사용하여 정시 작업을 구성합니다. 2.@Scheduled 메모를 사용합니다.Spring Boot 프로젝트이기 때문에 XML 구성의 형식을 최대한 피할 수 있습니다. 주로 메모의 형식을 말합니다.
Spring Schedule은 다음과 같은 세 가지 유형의 정시 작업을 제공합니다.
고정 대기 시간 @Scheduled(fixedDelay = 시간 간격)

@Component
public class ScheduleJobs {
  public final static long SECOND = 1 * 1000;
  FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");


  @Scheduled(fixedDelay = SECOND * 2)
  public void fixedDelayJob() throws InterruptedException {
    TimeUnit.SECONDS.sleep(2);
    System.out.println("[FixedDelayJob Execute]"+fdf.format(new Date()));
  }
}
고정 간격 @Scheduled(fixedRate = 시간 간격)

@Component
public class ScheduleJobs {
  public final static long SECOND = 1 * 1000;
  FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");


  @Scheduled(fixedRate = SECOND * 4)
  public void fixedRateJob() {
    System.out.println("[FixedRateJob Execute]"+fdf.format(new Date()));
  }
}
Corn 표현식 @Scheduled(cron = Corn 표현식)

@Component
public class ScheduleJobs {
  public final static long SECOND = 1 * 1000;
  FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");


  @Scheduled(cron = "0/4 * * * * ?")
  public void cronJob() {
    System.out.println("[CronJob Execute]"+fdf.format(new Date()));
  }
}

Spring Boot 통합 Quartz 정시 작업 수행
aven 의존 추가

    <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
    </dependency>
Spring Boot 통합 Quartz
Spring 프로젝트 통합 Quartz는 주로 Scheduler Factory Bean이라는 Factory Bean을 추가하기 때문에maven 의존에spring-context-support를 추가합니다.
우선 QuartzConfig 클래스를 추가하여 관련 Bean을 설명합니다.

@Configuration
public class QuartzConfig {
  @Autowired
  private SpringJobFactory springJobFactory;

  @Bean
  public SchedulerFactoryBean schedulerFactoryBean() {
    SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
    schedulerFactoryBean.setJobFactory(springJobFactory);
    return schedulerFactoryBean;
  }

  @Bean
  public Scheduler scheduler() {
    return schedulerFactoryBean().getScheduler();
  }
}

여기에서 우리는 내가 사용자 정의 JobFactory를 주입한 후에 그것을 Scheduler Factory Bean의 JobFactory로 설정한 것을 주의해야 한다.그 목적은 내가 구체적인 Job에서 Spring에 서비스를 주입해야 하기 때문이다.
따라서 구체적인job류가 실례화될 때Spring의 API를 사용하여 의존 주입을 할 수 있도록jobfactory를 사용자 정의해야 합니다.
SpringJobFactory 구현:

@Component
public class SpringJobFactory extends AdaptableJobFactory {

  @Autowired
  private AutowireCapableBeanFactory capableBeanFactory;

  @Override
  protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
    Object jobInstance = super.createJobInstance(bundle);
    capableBeanFactory.autowireBean(jobInstance);
    return jobInstance;
  }
}

구체적인 사용(프로젝트 코드에서 따옴):

@Service
public class QuartzEventServiceImpl implements QuartzEventService {
  private static final String JOB_GROUP = "event_job_group";
  private static final String TRIGGER_GROUP = "event_trigger_group";
  @Autowired
  private Scheduler scheduler;

  @Override
  public void addQuartz(Event event) throws SchedulerException {
    JSONObject eventData = JSONObject.parseObject(event.getEventData());
    Date triggerDate = eventData.getDate("date");
    JobDetail job = JobBuilder.newJob(EventJob.class).withIdentity(event.getId().toString(), JOB_GROUP).usingJobData(buildJobDateMap(event)).build();
    Trigger trigger = TriggerBuilder.newTrigger().withIdentity(event.getId().toString(), TRIGGER_GROUP).startAt(triggerDate).build();
    scheduler.scheduleJob(job, trigger);
  }
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기