springboot 에서 quartz 를 사용 하여 정시 작업 을 진행 합 니 다.
quartz 소개:
job:인터페이스,안에 execute 방법 이 있어 야 합 니 다.그 중에서 매개 변수 JobExecution Context 는 job 와 관련 된 정 보 를 봉인 했다.
JobDetail:Use a
JobKey
with the given name and group to identify the JobDetail 은 name 처럼 group 이 다 르 더 라 도 같은 정시 작업 이 아 닙 니 다.job 보다 인자 group 이 하나 더 많 습 니 다.Trigger:Use a TriggerKey with the given name and group to identify the Trigger 역시 name 과 group 을 통 해 유일한 표 지 를 하지만 TriggerBuilder 가 trigger 를 구축 할 때 사용 하지 않 았 다 면
withIdentity(name,group)
일반적인 trigger 를 사용 합 니 다.Scheduler:스 케 쥴 러 용기,Job 과 Trigger 는 모두 용기 에 등록 하고 용기 에 의 해 통일 적 으로 관리 되 어야 합 니 다.scheduler 에 job 의 기본 동작 이 있 습 니 다.예 를 들 어 일시 정지 삭제 등 이 있 습 니 다.
quartz springboot 도입:
인입 가방
org.quartz-scheduler
quartz
2.2.1
org.springframework
spring-context-support
시작 시 tomcat 정보
2018-11-22 11:26:57 localhost-startStop-1 INFO Scheduler meta-data: Quartz Scheduler (v2.2.1) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 5 threads.
Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.
quartz 저장 방식 이 많 습 니 다.저 는 편리 하도록 메모리 에 직접 존재 하고 데이터 베 이 스 를 존재 할 수 있 습 니 다.설정 파일 을 resource 아래 에 직접 복사 하면 됩 니 다.springboot 는 설정 정 보 를 자동 으로 읽 습 니 다.
# org.quartz
# scheduler、threadPool、jobStore、plugin
#
#
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
# threadCount threadPriority setter ThreadPool
#
org.quartz.threadPool.threadCount = 5
#
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
org.quartz.jobStore.misfireThreshold = 5000
#
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
# ,
#org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.tablePrefix = QRTZ_
#org.quartz.jobStore.dataSource = qzDS
#org.quartz.dataSource.qzDS.driver = com.mysql.jdbc.Driver
#org.quartz.dataSource.qzDS.URL =
#org.quartz.dataSource.qzDS.user =
#org.quartz.dataSource.qzDS.password =
#org.quartz.dataSource.qzDS.maxConnections = 10
여기에 구 덩이 를 기록 하고 job 실현 류 에서
@Autowired
services 를 주입 하여 데이터 베 이 스 를 조작 하거나 다른 것 을 하면 빈 포인터 이상 을 알 립 니 다.즉,jobinstance
spring 에 대리 되 지 않 았 으 며,JobFactory
에서 사용AutowireCapableBeanFactory
하여 수 동 으로 주입 해 야 한 다 는 것 이다.@Component
public class JobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
//
Object jobInstance = super.createJobInstance(bundle);
//
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
설정 정보:
@Configuration
public class SchedulerConfig {
@Autowired
private JobFactory jobFactory;
@Bean(name="SchedulerFactory")
public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setJobFactory(jobFactory);
factory.setQuartzProperties(quartzProperties());
return factory;
}
@Bean
public Properties quartzProperties() throws IOException {
PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
// quartz.properties
propertiesFactoryBean.afterPropertiesSet();
return propertiesFactoryBean.getObject();
}
/*
* quartz
*/
@Bean
public QuartzInitializerListener executorListener() {
return new QuartzInitializerListener();
}
/*
* SchedulerFactoryBean Scheduler
*/
@Bean(name="Scheduler")
public Scheduler scheduler() throws IOException {
return schedulerFactoryBean().getScheduler();
}
}
@RestContorller
을 사용 하여 정시 퀘 스 트 의 오픈 정지 등 작업 을 진행 합 니 다.@RestController
@RequestMapping(value="/job")
public class JobController
{
// Qulifier , bean
@Autowired @Qualifier("Scheduler")
private Scheduler scheduler;
@PostMapping(value="/addjob")
public void addjob(@RequestBody Map paraMap) throws Exception
{
addJob(paraMap.get("jobClassName"), paraMap.get("jobGroupName"), paraMap.get("cronExpression"));
}
public void addJob(String jobClassName, String jobGroupName, String cronExpression)throws Exception{
//
scheduler.start();
// job
JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass()).withIdentity(jobClassName, jobGroupName).build();
// ( )
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
// cronExpression trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName, jobGroupName)
.withSchedule(scheduleBuilder).build();
try {
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
System.out.println(" "+e);
throw new Exception(" ");
}
}
@PostMapping(value="/pausejob")
public void pausejob(@RequestBody Map paraMap) throws Exception
{
jobPause(paraMap.get("jobClassName"), paraMap.get("jobGroupName"));
}
public void jobPause(String jobClassName, String jobGroupName) throws Exception
{
scheduler.pauseJob(JobKey.jobKey(jobClassName, jobGroupName));
}
@PostMapping(value="/resumejob")
public void resumejob(@RequestBody Map paraMap) throws Exception
{
jobresume(paraMap.get("jobClassName"), paraMap.get("jobGroupName"));
}
public void jobresume(String jobClassName, String jobGroupName) throws Exception
{
scheduler.resumeJob(JobKey.jobKey(jobClassName, jobGroupName));
}
@PostMapping(value="/reschedulejob")
public void rescheduleJob(@RequestBody Map paraMap) throws Exception
{
jobreschedule(paraMap.get("jobClassName"), paraMap.get("jobGroupName"), paraMap.get("cronExpression"));
}
public void jobreschedule(String jobClassName, String jobGroupName, String cronExpression) throws Exception
{
try {
TriggerKey triggerKey = TriggerKey.triggerKey(jobClassName, jobGroupName);
//
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// cronExpression trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
// trigger job
scheduler.rescheduleJob(triggerKey, trigger);
} catch (SchedulerException e) {
System.out.println(" "+e);
throw new Exception(" ");
}
}
@PostMapping(value="/deletejob")
public void deletejob(@RequestBody Map paraMap) throws Exception
{
jobdelete(paraMap.get("jobClassName"), paraMap.get("jobGroupName"));
}
public void jobdelete(String jobClassName, String jobGroupName) throws Exception
{
scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName, jobGroupName));
scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName, jobGroupName));
scheduler.deleteJob(JobKey.jobKey(jobClassName, jobGroupName));
}
@PostMapping(value="/getalljob")
public List getalljob() throws Exception
{
return getAllJobs();
}
public List getAllJobs(){
try {
List list = new ArrayList();
for (String groupName : scheduler.getJobGroupNames()) {
for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName))) {
String jobName = jobKey.getName();
String jobGroup = jobKey.getGroup();
//get job's trigger
List triggers = (List) scheduler.getTriggersOfJob(jobKey);
Date nextFireTime = triggers.get(0).getNextFireTime();
list.add(("[jobName] : " + jobName + " [groupName] : "
+ jobGroup + " - " + nextFireTime));
}
}
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static BaseJob getClass(String classname) throws Exception
{
Class> class1 = Class.forName(classname);
return (BaseJob)class1.newInstance();
}
}
import org.quartz.Job;
public interface BaseJob extends Job {
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 클래스 상용 방법 분석Class 클래스 는 자바 에서 클래스 정 보 를 저장 하 는 인 스 턴 스 입 니 다.그 안에 각종 반사 방법 이 있 는데 이미 가지 고 있 는 정 보 를 파악 하고 그것 을 익히 면 우리 의 일상적인 반사 프로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.