자바 아래 SpringBoot 생 성 정시 작업 상세 설명
7642 단어 JavaSpringBoot정시 임무
SpringBoot 를 사용 하여 정시 작업 을 만 드 는 것 은 매우 간단 합 니 다.현재 다음 과 같은 세 가지 생 성 방식 이 있 습 니 다.
주석 기반@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 표현 식 매개 변 수 는 다음 과 같 습 니 다.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 가 정시 작업 을 만 드 는 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.