자바 아래 SpringBoot 생 성 정시 작업 상세 설명

서언
SpringBoot 를 사용 하여 정시 작업 을 만 드 는 것 은 매우 간단 합 니 다.현재 다음 과 같은 세 가지 생 성 방식 이 있 습 니 다.
  • 1.주석 기반(@Scheduled)
  • 2.인터페이스 기반(Scheduling Configurer)전 자 는 모두 가 잘 알 고 있다 고 믿 지만 실제 사용 할 때 우 리 는 데이터 베이스 에서 지 정 된 시간 을 읽 고 정시 임 무 를 동적 으로 수행 하려 고 한다.이때 인터페이스 기반 의 정시 임 무 는 도움 이 된다.
  • 3.주 해 를 바탕 으로 다 중 스 레 드 정시 임 무 를 설정 합 니 다
  • 1.정적:주석 기반
    주석 기반@Scheduled 기본 값 은 단일 스 레 드 입 니 다.여러 작업 을 시작 할 때 작업 을 수행 할 때 기 회 는 이전 작업 수행 시간의 영향 을 받 습 니 다.
    1.타이머 만 들 기
    SpringBoot 를 사용 하여 주석 을 기반 으로 정시 작업 을 만 드 는 것 은 매우 간단 하 며,몇 줄 의 코드 만 있 으 면 완성 할 수 있 습 니 다.코드 는 다음 과 같 습 니 다:
    
    @Configuration //1.         ,  Component   。
    @EnableScheduling // 2.      
    public class SaticScheduleTask {
     //3.      
     @Scheduled(cron = "0/5 * * * * ?")
     //         ,  :5 
     //@Scheduled(fixedRate=5000)
     private void configureTasks() {
     System.err.println("          : " + LocalDateTime.now());
     }
    }
    Cron 표현 식 매개 변 수 는 다음 과 같 습 니 다.
  • 초(0~59)예 를 들 어 0/5 는 5 초 마다
  • 을 나타 낸다.
  • 점(0~59)
  • 시(0~23)
  • 일(0~31)의 어느 날,
  • 을 계산 해 야 한다.
  • 월(0~11)주 몇 일(1-7 또는 SUN/MON/TUE/WED/THU/FRI/SAT)
  • @Scheduled:유연 한 매개 변수 표현 식 cron 을 지원 하 는 동시에 fixedDelay,fixedRate 등 간단 한 지연 작업 도 지원 합 니 다.
    2.테스트 시작
    응용 프로그램 을 시작 하면 콘 솔 에서 다음 과 같은 정 보 를 출력 하 는 것 을 볼 수 있 습 니 다.

    분명 한 것 은@Scheduled 주 해 를 사용 하 는 것 이 편리 하지만 실행 주 기 를 조정 할 때 응용 프로그램 을 다시 시작 해 야 효력 이 발생 하 는 것 이 단점 입 니 다.이것 은 다소 불편 합 니 다.실시 간 으로 효력 이 발생 하 는 효 과 를 얻 기 위해 서 는 인 터 페 이 스 를 사용 하여 정시 임 무 를 완성 할 수 있다.
    2.동적:인터페이스 기반
    인터페이스 기반(스케줄 링 Configurer)
    1.의존 패키지 가 져 오기
    
    <parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter</artifactId>
     <version>2.0.4.RELEASE</version>
     </parent>
    
     <dependencies>
     <dependency><!--  Web   -->
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
     <dependency><!--  MySql   -->
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
     </dependency>
     <dependency><!--  Mybatis     mybatis         -->
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>1.3.1</version>
     </dependency>
     <dependency><!--   mybatis   -->
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
      <scope>compile</scope>
     </dependency>
     </dependencies>
    2.데이터베이스 기록 추가:
    로 컬 데이터베이스 my sql 을 열 고 검색 창 을 마음대로 열 고 스 크 립 트 내용 을 실행 합 니 다.다음 과 같 습 니 다.
    
    DROP DATABASE IF EXISTS `socks`;
    CREATE DATABASE `socks`;
    USE `SOCKS`;
    DROP TABLE IF EXISTS `cron`;
    CREATE TABLE `cron` (
     `cron_id` varchar(30) NOT NULL PRIMARY KEY,
     `cron` varchar(30) NOT NULL 
    );
    INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');

    그리고 프로젝트 에 있 는 application.yml 에 데이터 원본 을 추가 합 니 다.
    
    spring:
     datasource:
     url: jdbc:mysql://localhost:3306/socks
     username: root
     password: 123456
    3.타이머 만 들 기
    데이터 베 이 스 를 준비 한 후에 저 희 는 정시 작업 을 작성 합 니 다.여기 추 가 된 것 은 TriggerTask 입 니 다.데이터 베 이 스 를 설정 한 실행 주기 와 관련 된 정시 작업 의 내용 을 순환 적 으로 읽 기 위해 서 입 니 다.
    구체 적 인 코드 는 다음 과 같다.
    
    @Configuration //1.         ,  Component   。
    @EnableScheduling // 2.      
    public class DynamicScheduleTask implements SchedulingConfigurer {
    
     @Mapper
     public interface CronMapper {
     @Select("select cron from cron limit 1")
     public String getCron();
     }
    
     @Autowired //  mapper
     @SuppressWarnings("all")
     CronMapper cronMapper;
    
     /**
     *       .
     */
     @Override
     public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    
     taskRegistrar.addTriggerTask(
      //1.      (Runnable)
      () -> System.out.println("        : " + LocalDateTime.now().toLocalTime()),
      //2.      (Trigger)
      triggerContext -> {
       //2.1           
       String cron = cronMapper.getCron();
       //2.2      .
       if (StringUtils.isEmpty(cron)) {
       // Omitted Code ..
       }
       //2.3       (Date)
       return new CronTrigger(cron).nextExecutionTime(triggerContext);
      }
     );
     }
    
    }
    4.테스트 시작
    응용 프로그램 을 시작 한 후 콘 솔 을 보십시오.인쇄 시간 은 우리 가 예상 한 10 초 에 한 번 씩 입 니 다.

    그리고 Navicat 를 열 고 실행 주 기 를 6 초 에 한 번 씩 실행 하 는 것 으로 변경 합 니 다.그림 과 같 습 니 다.

    콘 솔 을 보면 실행 주기 가 바 뀌 었 고 다시 시작 할 필요 가 없어 편리 합 니 다.그림:

    메모:데이터베이스 수정 시 형식 에 오류 가 발생 하면 정시 작업 이 중단 되 며,다시 수정 하 더 라 도.이 때 는 항목 을 다시 시작 해야만 복구 할 수 있 습 니 다.
    3.다 중 스 레 드 정시 임무
    주석 기반 다 중 스 레 드 정시 작업 설정
    1.다 중 스 레 드 생 성 정시 작업
    
    //@Component                 ;
    //       、            @Repository、@Service   @Controller           
    @Component
    @EnableScheduling // 1.      
    @EnableAsync // 2.     
    public class MultithreadScheduleTask {
    
     @Async
     @Scheduled(fixedDelay = 1000) //  1 
     public void first() throws InterruptedException {
      System.out.println("          : " + LocalDateTime.now().toLocalTime() + "\r
    : " + Thread.currentThread().getName()); System.out.println(); Thread.sleep(1000 * 10); } @Async @Scheduled(fixedDelay = 2000) public void second() { System.out.println(" : " + LocalDateTime.now().toLocalTime() + "\r
    : " + Thread.currentThread().getName()); System.out.println(); } }
    주:여기 @Async 주해 가 관건 입 니 다.
    2.테스트 시작
    프로그램 시작 후 콘 솔 보기:

    콘 솔 에서 알 수 있 듯 이 첫 번 째 정시 임무 와 두 번 째 정시 임 무 는 서로 영향 을 주지 않 는 다.
    또한 다 중 스 레 드 가 열 렸 기 때문에 첫 번 째 작업 의 수행 시간 도 그 자체 의 실행 시간의 제한 을 받 지 않 기 때문에 중복 작업 으로 인해 데이터 이상 이 발생 할 수 있 음 을 주의해 야 합 니 다.
    자바 에서 SpringBoot 가 정시 작업 을 만 드 는 것 에 대한 상세 한 설명 은 여기까지 입 니 다.더 많은 SpringBoot 가 정시 작업 을 만 드 는 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기