spring 에서 schedule 주해 방식 으로 정시 작업 실현
4699 단어 개발 경험
① main 에서 정시 퀘 스 트 의 주 해 를 엽 니 다@EnableScheduling
package com.jiangcheng;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling //
@SpringBootApplication
public class TaskApplication {
public static void main(String[] args) {
SpringApplication.run(TaskApplication.class, args);
}
}
② Service 에서 정시 작업@Scheduled 작성
package com.jiangcheng.service;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Service
public class TaskService {
/**
* second( ), minute( ), hour( ), day of month( ), month( ), day of week( ).
* :
* 【0 0/5 14,18 * * ?】 14 , 18 , 5
* 【0 15 10 ? * 1-6】 10:15
* 【0 0 2 ? * 6L】 2
* 【0 0 2 LW * ?】 2
* 【0 0 2-4 ? * 1#1】 2 4 , ;
*/
@Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT")
public void runTask(){
System.out.println(new Date()+" ");
}
}
③ Maven 의존
org.springframework.boot
spring-boot-starter-parent
spring 주해 방식 의 장점 은 사용 이 간단 하고 약점 은 분포 식 을 지원 하지 않 습 니 다.분포 식 을 실현 하려 면 여러 서비스 가 같은 자원 에 방문 하여 다른 서비스 가 이미 정시 임 무 를 실 행 했 는 지 판단 하도록 변경 해 야 한다.다음 과 같은 방식 으로 두 번 째 단계 의 방법 을 개조 해 야 한다.
private static String serverIp = null;
static {
// IP ,
try {
InetAddress address = InetAddress.getLocalHost();
serverIp = address.getHostAddress();
} catch (Exception e) {
logger.error(" IP !!");
e.printStackTrace();
}
}
/**
* second( ), minute( ), hour( ), day of month( ), month( ), day of week( ).
* :
* 【0 0/5 14,18 * * ?】 14 , 18 , 5
* 【0 15 10 ? * 1-6】 10:15
* 【0 0 2 ? * 6L】 2
* 【0 0 2 LW * ?】 2
* 【0 0 2-4 ? * 1#1】 2 4 , ;
*/
@Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT")
public void runTask(){
logger.info("job start");
String jobName = "doTask";
long startTime = new Date().getTime();
try {
if (checkTask(jobName)){
jobMapper.doTaskSchedule();
jobMapper.updateJobStatus(jobName,serverIp,"off");
logger.info(jobName+" , :"+(new Date().getTime()-startTime)+" !");
System.out.println(new Date()+" ");
}
} catch (Exception e) {
e.printStackTrace();
}
}
private Boolean checkTask(String jobName) throws Exception {
int max = 10000;
int min = (int) Math.round(Math.random()*8000);
long sleepTime = Math.round(Math.random()*(max-min));
logger.info(jobName+" :"+ sleepTime + " ");
Thread.sleep(sleepTime);
if (jobMapper.getJobOff(jobName) == 1){
jobMapper.updateJobStatus(jobName,serverIp,"on");
return true;
}
logger.info(jobName+" ");
return false;
}
데이터베이스 추가 표:
CREATE TABLE `job_manager` (
`job_name` varchar(50) NOT NULL PRIMARY KEY COMMENT ' ',
`job_desc` varchar(50) COMMENT 'job ',
`server_ip` varchar(50) NOT NULL COMMENT ' ip',
`on_off` varchar(10) DEFAULT 'off' COMMENT ' (on: ,off: )',
`update_date` datetime NOT NULL COMMENT ' '
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='job ' ROW_FORMAT=DYNAMIC;
INSERT INTO `job_manager`
VALUES
('doTask',' doTask job','0.0.0.0','off',now());
작업 상태 에서 sql 조회 또는 수정:
UPDATE job_manager
SET on_off=#{status},server_ip=#{serverIp},update_date=now()
WHERE job_name = #{jobName}