자바 에서 Spring task 정시 임무 에 대한 깊 은 이해

10742 단어 Springtask
자바 에서 Spring task 정시 임무 에 대한 깊 은 이해
작업 중 에 spring task 를 정시 작업 으로 처리 할 수 있 습 니 다.spring 은 인터페이스 TaskExecutor 와 Task Scheduler 라 는 두 인터페이스 방식 을 통 해 비동기 정시 작업 에 추상 적 인 것 을 제공 합 니 다.이것 은 spring 이 다른 정시 작업 프레임 워 크 를 사용 하 는 것 을 허용 한 다 는 것 을 의미 합 니 다.물론 spring 자체 도 정시 작업 의 실현 을 제공 합 니 다:spring task.spring task 는 스 레 드 탱크 를 지원 하여 다양한 정시 작업 을 효율적으로 처리 할 수 있 습 니 다.또한,spring 은 자바 가 자체 적 으로 가지 고 있 는 Timer 타이머 와 Quartz 타 이 밍 프레임 워 크 를 지원 합 니 다.지면 에 한 하여 spring task 의 사용 만 소개 합 니 다.
사실 공식 문 서 는 영어 판 에 불과 하기 때문에 spring task 를 잘 이해 하고 사용 하기 위해 서 는 먼저 spring task 의 실현 원리 에 대해 간단 한 소 개 를 한 다음 에 실제 코드 를 통 해 spring task 가 어떻게 사용 하 는 지 보 여 줍 니 다.이것 은 매우 중요 한 지식 점 인 cron 표현 식 과 관련 될 것 입 니 다.
TaskExecutor 와 Task Scheduler
TaskExecutor 는 spring task 의 첫 번 째 추상 입 니 다.jdk 에서 concurrent 가방 에 있 는 Executor 를 자 연 스 럽 게 연상 시 킵 니 다.실제로 TaskExecutor 는 Executor 와 구별 되 기 위해 도 입 된 것 입 니 다.TaskExecutor 를 도입 하 는 목적 은 정시 작업 수행 에 스 레 드 탱크 의 지 지 를 제공 하 는 것 입 니 다.그렇다면 문 제 는 왜 spring 이 jdk 자체 의 Executor 를 직접 사용 하지 않 습 니까?작업 실행 자 원본 코드 는 다음 과 같 습 니까?

public interface TaskExecutor extends Executor {
  void execute(Runnable var1);
}
그렇다면 답 은 분명 하 다.TaskExecutor 가 제공 하 는 스 레 드 풀 지원 도 jdk 자체 의 Executor 를 바탕 으로 한다.Executor 에 사용 하 는 방법 은 다 를 것 이 없다.
Task Scheduler 는 spring task 의 두 번 째 추상 입 니 다.그렇다면 말 그대로 Task Scheduler 는 정시 임 무 를 지원 하기 위 한 것 입 니 다.Task Scheduler 는 Runnable 의 작업 을 매개 변수 로 전송 하고 주기 적 으로 실행 해 야 할 시간 이나 트리거 를 지정 해 야 Runnable 작업 을 주기 적 으로 수행 할 수 있 습 니 다.전송 시간 은 이해 하기 쉽 습 니 다.재 미 있 는 것 은 트리거(Trigger)가 들 어 오 는 경우 입 니 다.cron 표현 식 을 사용 하여 정시 작업 을 수행 해 야 하기 때문에 cron 표현 식 의 사용 을 먼저 알 아 볼 필요 가 있 습 니 다.
spring 4.x 에 서 는 7 개의 인자 가 지원 되 지 않 는 cronin 표현 식 입 니 다.6 개의 인자 가 필요 합 니 다.cron 표현 식 의 형식 은 다음 과 같 습 니 다:

{ } { } { } {  (    )} { } {  }
  • 초:필수 항목,허용 하 는 값 범 위 는 0-59 이 고 지원 하 는 특수 기 호 는
  • 을 포함한다.
  • ,-*/,특정한 초 에 만 퀘 스 트 를 촉발 한 다 는 뜻 입 니 다.-한 동안 퀘 스 트 를 촉발 한 다 는 뜻 입 니 다.
  • 점:필수 항목,허용 하 는 값 범 위 는 0-59 이 고 지원 하 는 특수 기 호 는 초 와 같 으 며 의 미 는
  • 으로 유추 합 니 다.
  • 시:필수 항목,허용 하 는 값 범 위 는 0-23 이 고 지원 하 는 특수 기 호 는 초 와 같 으 며 의 미 는
  • 으로 유추 합 니 다.
  • 날짜:필수 항목,허용 하 는 값 범 위 는 1-31 입 니 다.지원 하 는 특수 기호 가 초 보다 많 습 니까?{요일}과 상호 배척 하 는 것 은{요일}을 명확 하 게 지정 하면{날짜}가 의미 가 없 음 을 의미 하 며 충돌 과 혼란 을 일 으 키 지 않도록 합 니 다.
  • 월:필수 항목,허용 하 는 값 범 위 는 1-12(JAN-DEC)이 고 지원 하 는 특수 기 호 는 초 와 같 으 며 의 미 는
  • 으로 유추 합 니 다.
  • 주:필수 항목 입 니 다.허용 치 범 위 는 1~7(SUN-SAT)입 니 다.1 은 일요일(일주일 의 첫날)을 대표 합 니 다.이런 식 으로 7 은 토요일 을 대표 합 니 다.지원 하 는 기호 가 초 보다 많 습 니까?표현 하 는 의 미 는{날짜}와 서로 배척 하 는 것 입 니 다.즉,{날짜}트리거 를 명확 하 게 지정 하면{주}이 의미 가 없 음 을 의미 합 니 다.
  • 예 를 들 어 다음 cron 표현 식:
    
    //       :          
    30 * * * * ?
    spring 은 CronTrigger 를 제공 합 니 다.Runnable 작업 과 CronTrigger 를 전송 하면 cron 표현 식 으로 정시 작업 을 지정 할 수 있 습 니 다.매우 중요 하지 않 습 니까?실제로 프로젝트 실천 에서 도 cron 표현 식 은 많이 사용 된다.실제로 다음 코드 를 실 행 했 습 니 다.
    
    scheduler.schedule(task, new CronTrigger("30 * * * * ?"));
    Task Scheduler 의 추상 적 인 장점 은 시간 임 무 를 수행 해 야 하 는 코드 가 특정한 시간 프레임 워 크(예 를 들 어 Timer 와 Quartz)를 지정 하지 않 아 도 된다 는 것 이다.Task Scheduler 의 더욱 간단 한 실현 은 Thread PoolTask Scheduler 입 니 다.실제 jdk 의 Scheduling Task Executor 를 대리 하고 Task Executor 인 터 페 이 스 를 실현 하기 때문에 정기 적 인 임 무 를 자주 수행 해 야 하 는 장면 은 이 를 사용 할 수 있 습 니 다(Spring 추천).Task Executor 와 Task Scheduler 의 계승 관 계 를 다시 한 번 살 펴 보 겠 습 니 다.

    일반적으로 spring task 를 사용 하여 정시 작업 을 수행 하 는 방법 은 두 가지 가 있 습 니 다.주해 와 xml 설정 파일 입 니 다.xml 프로필 을 사용 하여 설명 합 니 다.
    실전
    Maven 프로젝트,pom.xml 만 들 기:
    
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.rhwayfun</groupId>
      <artifactId>sring-task-demo</artifactId>
      <version>1.0-SNAPSHOT</version>
    
      <dependencies>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>4.2.4.RELEASE</version>
        </dependency>
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    
    
    정시 임 무 를 수행 해 야 하 는 방법 개발:
    
    package com.rhwayfun.task;
    
    import org.springframework.stereotype.Component;
    
    import java.time.LocalDateTime;
    
    /**
     * @author ZhongCB
     * @date 2016 09 10  14:30
     * @description
     */
    @Component
    public class App {
    
      public void execute1(){
        System.out.printf("Task: %s, Current time: %s
    ", 1, LocalDateTime.now()); } public void execute2(){ System.out.printf("Task: %s, Current time: %s
    ", 2, LocalDateTime.now()); } public void execute3(){ System.out.printf("Task: %s, Current time: %s
    ", 3, LocalDateTime.now()); } public void execute4(){ System.out.printf("Task: %s, Current time: %s
    ", 4, LocalDateTime.now()); } public void execute5(){ System.out.printf("Task: %s, Current time: %s
    ", 5, LocalDateTime.now()); } public void execute6(){ System.out.printf("Task: %s, Current time: %s
    ", 6, LocalDateTime.now()); } public void execute7(){ System.out.printf("Task: %s, Current time: %s
    ", 7, LocalDateTime.now()); } public void execute8(){ System.out.printf("Task: %s, Current time: %s
    ", 8, LocalDateTime.now()); } public void execute9(){ System.out.printf("Task: %s, Current time: %s
    ", 9, LocalDateTime.now()); } public void execute10(){ System.out.printf("Task: %s, Current time: %s
    ", 10, LocalDateTime.now()); } public void execute11(){ System.out.printf("Task: %s, Current time: %s
    ", 11, LocalDateTime.now()); } }
    spring 프로필 은 다음 과 같 습 니 다:
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:task="http://www.springframework.org/schema/task"
        xsi:schemaLocation="
          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
          http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd">
    
      <!--        -->
      <context:component-scan base-package="com.rhwayfun.task"/>
    
      <task:scheduler id="taskScheduler" pool-size="100" />
    
      <task:scheduled-tasks scheduler="taskScheduler">
        <!--          -->
        <task:scheduled ref="app" method="execute1" cron="30 * * * * ?"/>
        <!--     10 30      -->
        <task:scheduled ref="app" method="execute2" cron="30 10 * * * ?"/>
        <!--   1 10 30      -->
        <task:scheduled ref="app" method="execute3" cron="30 10 1 * * ?"/>
        <!--   20  1 10 30      -->
        <task:scheduled ref="app" method="execute4" cron="30 10 1 20 * ?"/>
        <!--   10 20  1 10 30      -->
        <task:scheduled ref="app" method="execute5" cron="30 10 1 20 10 ?"/>
        <!--  15 、30 、45       -->
        <task:scheduled ref="app" method="execute6" cron="15,30,45 * * * * ?"/>
        <!-- 15  45   1      -->
        <task:scheduled ref="app" method="execute7" cron="15-45 * * * * ?"/>
        <!--      15      ,  5      -->
        <task:scheduled ref="app" method="execute8" cron="15/5 * * * * ?"/>
        <!--     15 30       ,  5      -->
        <task:scheduled ref="app" method="execute9" cron="15-30/5 * * * * ?"/>
        <!--     0 0     ,  3       -->
        <task:scheduled ref="app" method="execute10" cron="0 0/3 * * * ?"/>
        <!--         10 15 0      -->
        <task:scheduled ref="app" method="execute11" cron="0 15 10 ? * MON-FRI"/>
      </task:scheduled-tasks>
    
    </beans>
    
    
    테스트 코드 작성:
    
    package com.rhwayfun.task;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    /**
     * @author ZhongCB
     * @date 2016 09 10  14:55
     * @description
     */
    public class AppTest {
    
      public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/app-context-task.xml");
      }
    }
    
    
    테스트 코드 를 실행 하면 콘 솔 은 모든 정시 작업 의 로그 정 보 를 정시 에 출력 하여 테스트 가 통과 되 었 음 을 설명 합 니 다.
    에피소드
    프로젝트 는 jdk 1.8 를 사용 하여 개발 되 었 기 때문에 처음에 pom 파일 이 수정 되 었 을 때마다 컴 파일 러 의 버 전 은 jdk 1.5 로 바 뀌 었 습 니 다.나중에 pom 파일 에 build 메모 부분 을 추가 해 야 기본 컴 파일 러 를 수정 할 수 있 습 니 다.작은 수확 이 라 고 할 수 있 습 니 다.
    궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 의 커 뮤 니 티 에 가서 토론 을 교류 하 세 요.읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기