springboot+quartz 는 정시 작업 을 지속 적 으로 수행 하 는 코드 입 니 다.
12048 단어 springbootquartz정시 임무
분량 이 길 고 인내심 이 있 는 사람 은 항상 마지막 답 을 얻 을 수 있 습 니 다.
맨 먼저
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 정시 임무 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin Springboot -- 파트 14 사용 사례 REST로 전환하여 POST로 JSON으로 전환前回 前回 前回 記事 の は は で で で で で で を 使っ 使っ 使っ て て て て て リクエスト を を 受け取り 、 reqeustbody で 、 その リクエスト の ボディ ボディ を を 受け取り 、 関数 内部 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.