springboot+quartz 는 정시 작업 을 지속 적 으로 수행 하 는 코드 입 니 다.

이 글 은 springboot+quartz 가 지속 적 인 방식 으로 정시 임 무 를 실현 하 는 것 을 소개 합 니 다.상세 한 내용 은 다음 과 같 습 니 다.
분량 이 길 고 인내심 이 있 는 사람 은 항상 마지막 답 을 얻 을 수 있 습 니 다.
맨 먼저
springboot 프로젝트 에서 정시 임 무 를 수행 하 는 것 은 비교적 간단 합 니 다.가장 간단 한 실현 방식 은**@Scheduled 주 해 를 사용 한 다음 에 application 시작 클래스 에서@Enable Scheduling**를 사용 하여 정시 임 무 를 시작 하 는 것 입 니 다.
예시

@SpringBootApplication
@EnableScheduling
public class Application {

 public static void main(String[] args) {
 SpringApplication.run(Application.class, args);
 }
 // cron       
 @Scheduled(cron = "* * * * * ?")
 public void print(){
 System.out.println("      ");
 }

}
\#\#\#\#\#결과
정시 임 무 를 수행 하 다.
정시 임 무 를 수행 하 다.
정시 임 무 를 수행 하 다.
정시 임 무 를 수행 하 다.
정시 임 무 를 수행 하 다.
정시 임 무 를 수행 하 다.
정시 임 무 를 수행 하 다.
정시 임 무 를 수행 하 다.
간단 한 정시 작업 은 이런 방식 으로 할 수 있 습 니 다.cron 표현 식 의 결 과 는 작업 수행 의 간격 입 니 다.
그러나.
실제 개발 에서 우리 의 임 무 는 매우 많 을 수 있 고 하나의/모든 임 무 를 수 동 으로 조작 해 야 한다.예 를 들 어 추가,오픈,정지,계속 등 이다.그러면(천우 B 류 와 함께...)의 BGM 은 쿼츠 를 모 시 겠 습 니 다.
quartz
통합

 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-quartz</artifactId>
 </dependency>
quartz 의 세 가지 요소
  • 스케줄 러 스케줄 러
  • 트리거 를 작 동 하여 임 무 를 수행 합 니 다
  • 트리거
    Job(퀘 스 트)트리거 조건,트리거 시간,트리거 간격,종료 시간 등 을 정의 합 니 다.
    태 스 크 작업
    구체 적 으로 수행 할 임무 내용
    쓰다
    quartz 를 사용 하려 면 설정 파일 이 필요 합 니 다.quartz.properties 는 quartz 의 jar 패키지 의 org.quartz 패키지 에서 기본 설정 파일 quartz.properties 를 찾 을 수 있 습 니 다.
    
    # Default Properties file for use by StdSchedulerFactory
    # to create a Quartz Scheduler Instance, if a different
    # properties file is not explicitly specified.
    #
    #   
    org.quartz.scheduler.instanceName: DefaultQuartzScheduler
    org.quartz.scheduler.rmi.export: false
    org.quartz.scheduler.rmi.proxy: false
    org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
    #    ThreadPool ,       SimpleThreadPool
    org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
    #      
    org.quartz.threadPool.threadCount: 10
    #       
    org.quartz.threadPool.threadPriority: 5
    org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
    
    org.quartz.jobStore.misfireThreshold: 60000
    #      ,         ,      db   
    org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
    quartz 작업 이 db 로 오래 지속 되 려 면 공식 적 으로 정 의 된 데이터베이스 시트 가 필요 합 니 다.표 의 sql 파일 은 quartz 의 jar 패키지 에서 찾 을 수 있 습 니 다.
    좌표 org.quartz.impl.jdbcjobstore 는 안에 sql 파일 이 많 고 각종 데이터 베이스 가 있 는 것 을 볼 수 있 습 니 다.우 리 는 MySQL 을 사용 합 니 다.우 리 는 sql 문 구 를 수 동 으로 실행 할 필요 가 없습니다.그 다음 에 우 리 는 프로젝트 를 시작 할 때 자동 으로 초기 화 합 니 다.
    우리 만 의 properties 파일 만 들 기
    
    #    ThreadPool ,       SimpleThreadPool
    org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
    # threadCount threadPriority  setter     ThreadPool  
    #     
    org.quartz.threadPool.threadCount=10
    #    
    org.quartz.threadPool.threadPriority=5
    org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
    org.quartz.jobStore.misfireThreshold=5000
    #       
    org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
    #        
    org.quartz.jobStore.tablePrefix=QRTZ_
    #     
    org.quartz.jobStore.dataSource=qzDS
    #qzDS    ,    hikaricp,    c3p0
    org.quartz.dataSource.qzDS.provider=hikaricp
    org.quartz.dataSource.qzDS.driver=com.mysql.cj.jdbc.Driver
    org.quartz.dataSource.qzDS.URL=jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
    org.quartz.dataSource.qzDS.user=root
    org.quartz.dataSource.qzDS.password=123456
    org.quartz.dataSource.qzDS.maxConnections=10
    기본 연결 탱크 를 사용 하지 않 았 으 니,원본 코드 를 탐색 해 보 세 요!이 가방 아래:org.quartz.utils,Pooling Connection Provider 가 있 습 니 다.말 그대로 연결 탱크 공급 자 부분 소스 코드 가 있 습 니 다.
    
    public interface PoolingConnectionProvider extends ConnectionProvider {
    
     /** The pooling provider. */
     String POOLING_PROVIDER = "provider";
    
     /** The c3p0 pooling provider. */
     String POOLING_PROVIDER_C3P0 = "c3p0";
    
     /** The Hikari pooling provider. */
     String POOLING_PROVIDER_HIKARICP = "hikaricp";
    
    }
    그리고 HikaricpPoolingConnection Provider 라 는 종 류 는 PoolingConnection Provider 를 실현 하여 스스로 확인 합 니 다.org.quartz.impl 의 StdScheduler Factory 에서 c3p 0 을 검색 하여 찾 을 수 있 습 니 다.
    
    if(poolingProvider != null && poolingProvider.equals(PoolingConnectionProvider.POOLING_PROVIDER_HIKARICP)) {
      cpClass = "org.quartz.utils.HikariCpPoolingConnectionProvider";
      }
      else {
      cpClass = "org.quartz.utils.C3p0PoolingConnectionProvider";
      }
    나머지 는 많이 보 세 요.처음에 소스 코드 를 연구 하 는 것 이 생각 보다 어렵 고 지루 하지 않 습 니 다.(저도 소스 코드 를 보 는 것 을 좋아 하지 않 습 니 다)하지만 이 소스 코드 는 확실히 작은 성취 감 을 가지 고 있 습 니 다.
    본론 채널 로 돌아 가 application.yml 설정
    
    spring:
     datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
     password: 123456
     url: jdbc:mysql://localhost:3306/quartz?characterEncoding=UTF8&useSSL=false&serverTimezone=GMT%2B8
     username: root
     quartz:
     jdbc:
     initialize-schema: always
     job-store-type: jdbc
    initialize-schema:always 프로젝트 를 시작 할 때마다 데이터베이스 시트 자동 생 성 표를 초기 화 하 는 관건 적 인 부분 입 니 다.절 차 는 데이터베이스 시트 를 먼저 삭제 한 다음 에 만 드 는 것 입 니 다.표 가 존재 하지 않 으 면 이상 을 버 리 지만 뒤의 생 성 표 에 영향 을 주지 않 습 니 다.다음 에 프로젝트 를 시작 할 때 표 가 이미 존재 하기 때 문 입 니 다.그래서 더 이상 이상 이상 던 지지 않 겠 습 니 다.job-store-type:jdbc 는 미 션 지속 화 유형 입 니 다.jdbc 를 사용 합 니 다.
    우 리 는 job 에 spring 대상 을 주입 해 야 할 수도 있 습 니 다.설정 을 하지 않 으 면 주입 할 수 없습니다.
    
    /**
     * @author: taoym
     * @date: 2020/6/4 11:32
     * @desc:       JobFactory  SpringBeanJobFactory createJobInstance  ,   job      spring    bean 
     */
    @Component
    public class JobFactory extends SpringBeanJobFactory {
    
     @Autowired
     private AutowireCapableBeanFactory beanFactory;
    
     /**
     *      super createJobInstance  ,           autowire
     */
     @Override
     protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
     Object jobInstance = super.createJobInstance(bundle);
     beanFactory.autowireBean(jobInstance);
     return jobInstance;
     }
    }
    quartz 프로필 만 들 기
    
    @Configuration
    public class QuartzConfig {
    
     @Autowired
     private JobFactory jobFactory;
    
     /**
     *   quartz.properties   
     *      
     *
     * @return
     */
     @Bean
     public Properties quartzProperties() throws IOException {
     PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
     propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
     propertiesFactoryBean.afterPropertiesSet();
     return propertiesFactoryBean.getObject();
     }
    
     @Bean
     public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
     SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
     schedulerFactoryBean.setJobFactory(jobFactory);
     schedulerFactoryBean.setQuartzProperties(quartzProperties());
     return schedulerFactoryBean;
     }
    
     /**
     *       
     *
     * @return
     */
     @Bean
     public QuartzInitializerListener executorListener() {
     return new QuartzInitializerListener();
     }
    
    
     @Bean(name = "scheduler")
     public Scheduler scheduler() throws IOException {
     return schedulerFactoryBean().getScheduler();
     }
    }
    트리거 구성 요소 만 들 기
    
    public class TriggerComponent {
    
     /**
     * @author: taoym
     * @date: 2020/6/1 10:35
     * @desc:   cron   
     */
     public static Trigger cronTrigger(String cron) {
     CronTrigger cronTrigger = TriggerBuilder.newTrigger()
     .withSchedule(CronScheduleBuilder.cronSchedule(cron).withMisfireHandlingInstructionDoNothing())
     .build();
     return cronTrigger;
     }
    
     public static Trigger cronTrigger(String cron, JobDataMap jobDataMap) {
     CronTrigger cronTrigger = TriggerBuilder.newTrigger()
     .withSchedule(CronScheduleBuilder.cronSchedule(cron).withMisfireHandlingInstructionDoNothing())
     .usingJobData(jobDataMap)
     .build();
     return cronTrigger;
     }
    }
    트리거 는 이 구성 요소 로 가 져 오 면 됩 니 다.
    작업 생 성
    
    @DisallowConcurrentExecution
    public class TestJob extends QuartzJobBean {
     @Override
     protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
     
     }
    }
    jobExecutionContext 에서 작업 그룹,작업 이름,트리거 그룹,트리거 이름,jobdetail 등 정 보 를 얻 을 수 있 습 니 다.그 주 해 는 같은 인 스 턴 스(jobdetail)가 단일 스 레 드 로 만 실 행 될 수 있 도록 하기 위 한 것 입 니 다.이렇게 이해 할 수 있 습 니 다.job 는 인터페이스 이 고 jobdetail 은 실현 류 입 니 다.a 는 그 중의 실현 류 입 니 다.a 는 100 s 를 들 여 일정한 조작 을 수행 해 야 합 니 다.그리고 당신 이 준 타 이 머 는 50s 없 이 한 번 의 조작 을 수행 합 니 다.a 는 절반 까지 실 행 될 때 하나의 스 레 드 를 열 어 실행 해 야 합 니 다.Disallow ConcurrentExecution 을 사용 하면 a 가 작업 을 다 수행 하지 않 았 을 때 a 는 스 레 드 를 열 고 현재 작업 을 수행 할 수 없습니다.내 설명 이 쉬 운 지 모 르 겠 어!
    필요 에 따라 자신의 퀘 스 트 표를 만 듭 니 다.저 는 정시 퀘 스 트 로 파충류(작은 파충류)를 만 듭 니 다.
    
    CREATE TABLE `quartz_job` (
     `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '  ',
     `job_name` varchar(50) DEFAULT '' COMMENT '   ',
     `job_group` varchar(50) DEFAULT '' COMMENT '     ',
     `job_desc` varchar(255) DEFAULT '' COMMENT 'job  ',
     `cron` varchar(50) DEFAULT '' COMMENT 'cron   ',
     `status` tinyint(1) DEFAULT '0' COMMENT '  ',
     `url` varchar(255) DEFAULT '' COMMENT '    ',
     `param` varchar(255) DEFAULT '' COMMENT '  ',
     PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8;
    우 리 는 임 무 를 추가 할 때 quartz 와 접촉 하지 않 고 임 무 를 데이터베이스 에 넣 으 면 된다.당황 하지 마라,뒤에 그 가 있 는 곳 이 있다.이 표 는 추가 삭제 및 수정 작업 이 필요 합 니 다.시스템 에서 작업 목록 을 조회 하여 하나 또는 모든 작업 을 시작 합 니 다.
    임 무 를 집행 하 다
    
    @Resource
     private QuartzJobMapper quartzJobMapper;
     @Autowired
     private Scheduler scheduler;
     
     
     @Override
     public String start(Integer id) {
     
    		JobDataMap jobDataMap = new JobDataMap();
     jobDataMap.put(k,v);
     
     QuartzJob quartzJob = quartzJobMapper.selectByPrimaryKey(id);
     
     JobKey jobKey = JobKey.jobKey(quartzJob.getJobName(), quartzJob.getJobGroup());
     
     jobDetail = JobBuilder.newJob(TestJob.class).withIdentity(jobKey).storeDurably().build();
     
     Trigger trigger = TriggerComponent.cronTrigger(quartzJob.getCron(), jobDataMap);
     try {
     scheduler.scheduleJob(jobDetail, trigger);
     quartzJobMapper.updateStatus(true, id);
     return "        ";
     } catch (SchedulerException se) {
     log.info("            ");
     }
     return "            ,     ";
     }
    마지막 으로 나 는 이 튜 토리 얼 의 내용 에 따라 코드 를 한 번 더 붙 여서 정상적으로 실행 할 수 있 었 다.





    spring boot+quartz 가 지속 적 인 방식 으로 정시 임 무 를 수행 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 spring boot+quartz 정시 임무 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기