spring 에서 schedule 주해 방식 으로 정시 작업 실현

4699 단어 개발 경험
정시 작업 은 자주 사용 되 는 기능 입 니 다.예 를 들 어 시간 초과 검색 등 데이터 검색 기능 이나 정시 발표 기능 은 spring boot 주해 식 코드 를 사용 하면 다음 과 같 습 니 다.
① 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}
    

좋은 웹페이지 즐겨찾기