자바 에서 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 표현 식 의 형식 은 다음 과 같 습 니 다:
{ } { } { } { ( )} { } { }
// :
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 메모 부분 을 추가 해 야 기본 컴 파일 러 를 수정 할 수 있 습 니 다.작은 수확 이 라 고 할 수 있 습 니 다.
궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 의 커 뮤 니 티 에 가서 토론 을 교류 하 세 요.읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.