Quzrtz概念
这是一个定时任务的线程
单机版结构
- 1.Job:定义一个任务必须实现Quartz接口
- 2.JobDetail:用于描述任务的详细信息(任务名称、任务分组等)
- 3.Trigger:定义任务的调度时机(调度规则)SimpleTrigger:定义任务的
执行的时间、执行频率、结束时间等CronTrigger:通过Cron表达式来定义 任务的执行规则 - 4.Scheduler:调度器,使用Trigger定义的时间、执行规则来调度Job
- 5.JobExecutionContext:任务执行上下文
- 6.JobBuilder、TriggerBuilder…
helloworld
public class Hellojob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(dateFormat.format(new Date())+"hello world");
}
}
public class First {
public static void main(String[] args) throws SchedulerException {
//创建JobDetail
JobDetail jobDetail = JobBuilder.newJob(Hellojob.class).withIdentity("hello", "hello").build();
//创建Trigger
SimpleTrigger trigger = TriggerBuilder.newTrigger().startNow().withIdentity("hello", "hello")
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
//创建Scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
}
}
SpringMVC搭载集群版Quartz
SpringRoot容器配置:
/*
1. 数据源
2. 事务管理器
3. JobDetailFactoryBean
特点:要求任务类继承QuartzJobBean
属性:name、group、jobClass(任务类的Class对象)、durability
4. CronTriggerFactoryBean
5. SchedulerFactoryBean
属性:数据源、事务管理、集群配置信息、triggers
*/
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql:///et2009" />
<property name="username" value="root" />
<property name="password" value="etoak" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- JobDetailFactoryBean -->
<bean id="emailJobDetail"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="name" value="emailJob" />
<property name="group" value="emailJob" />
<!-- 这里是Class对象, 不是Spring Bean。
要和MethodInvokingJobDetailFactoryBean的targetObject区分 -->
<property name="jobClass" value="com.etoak.job.EmailJob" />
<property name="durability" value="true" />
</bean>
<!-- CronTriggerFactoryBean -->
<bean id="emailTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="name" value="emailTrigger" />
<property name="group" value="emailTrigger" />
<property name="jobDetail" ref="emailJobDetail" />
<property name="cronExpression" value="0/10 * * * * ?" />
</bean>
<!-- SchedulerFactoryBean -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<!-- 集群配置信息 -->
<property name="configLocation"
value="classpath:quartz.properties" />
<property name="triggers">
<list>
<ref bean="emailTrigger" />
</list>
</property>
<property name="applicationContextSchedulerContextKey"
value="spring" />
</bean>
Job类,因为继承了QuartzJobBean而Spring容器不能管理这个bean,所以会导致我们没办法注入Service,所以采用下面这种手段,获得容器,强行获得ioc种管理的service
public class EmailJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
// 先获取Scheduler
Scheduler scheduler = context.getScheduler();
try {
// 再获取SchedulerContext
SchedulerContext schedulerContext = scheduler.getContext();
// 再获取IOC容器
ApplicationContext ioc =
(ApplicationContext)schedulerContext.get("spring");
// 最后从ioc容器中拿到Spring Bean
EmailService emailService = ioc.getBean(EmailService.class);
emailService.sendEmail();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
Job类的service
@Service
public class EmailService {
public void sendEmail() {
System.out.println("EmailService Send Email...");
}
}
Controller中继续和暂停
@RestController
@RequestMapping("/job")
public class JobController {
/** 已经通过SchedulerFactoryBean配置到Spring IOC容器了 */
@Autowired
Scheduler scheduler;
/** 暂停任务 */
@RequestMapping(value = "/pause", produces = "text/plain;charset=UTF-8")
public String pause(String jobName, String jobGroup) throws SchedulerException {
JobKey jobKey = new JobKey(jobName, jobGroup);
if (!scheduler.checkExists(jobKey)) {
return "任务不存在!";
}
// 暂停任务
scheduler.pauseJob(jobKey);
return "暂停成功";
}
/** 重启任务 */
@RequestMapping("/resume")
public String resume(String triggerName,
String triggerGroup) throws SchedulerException {
/* 先判断Trigger是否存在 */
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup);
if (!scheduler.checkExists(triggerKey)) {
return "Job Not Exists!";
}
/* 判断任务是否是暂停状态 */
Trigger.TriggerState state = scheduler.getTriggerState(triggerKey);
if (!state.equals(Trigger.TriggerState.PAUSED)) {
return "Job is Not Paused!";
}
scheduler.resumeTrigger(triggerKey);
return "Success";
}
SpringBoot搭载集群Quartz
@Configuration配置
//数据源
@Bean("ds1")
public DataSource dataSource(){
DruidDataSource druidDataSource =new DruidDataSource();
druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
druidDataSource.setUrl("jdbc:mysql:///et2009?serverTimezone=UTC");
druidDataSource.setUsername("root");
druidDataSource.setPassword("etoak");
return druidDataSource;
}
//事务管理器
@Bean
public DataSourceTransactionManager transactionManager(){
DataSourceTransactionManager transactionManager =new DataSourceTransactionManager();
transactionManager.setDataSource(this.dataSource());
return transactionManager;
}
//Schedulerfactorybean
@Bean
public SchedulerFactoryBean schedulerFactoryBean(
@Qualifier("ds1") DataSource dataSource,
DataSourceTransactionManager transactionManager
){
SchedulerFactoryBean schedulerFactoryBean =new SchedulerFactoryBean();
schedulerFactoryBean.setDataSource(dataSource);
schedulerFactoryBean.setTransactionManager(transactionManager);
//=======读配置文件
ResourcePatternResolver resolver =new PathMatchingResourcePatternResolver();
Resource resource =resolver.getResource("classpath:quartz.properties");
//=======
schedulerFactoryBean.setConfigLocation(resource);
schedulerFactoryBean.setApplicationContextSchedulerContextKey("spring");
return schedulerFactoryBean;
}
jobBean和service类和springMVC一样我就不写了 我们写上Controller,五个参数开这个线程,至于暂停和继续和上面一样
@RestController
@RequestMapping("/job")
public class JobController {
//集群的Quartz一旦开起来 不手动停不会自己停下的
@Autowired
Scheduler scheduler;
@RequestMapping("/create")
public String create(@RequestParam String jobName,
@RequestParam String jobGroup,
@RequestParam String triggerName,
@RequestParam String triggerGroup,
@RequestParam String cron) throws ParseException, SchedulerException {
JobDetailImpl jobDetail =new JobDetailImpl();
jobDetail.setName(jobName);
jobDetail.setGroup(jobGroup);
jobDetail.setJobClass(EmailJob.class);
jobDetail.setDurability(true);
CronTriggerImpl cronTrigger =new CronTriggerImpl();
cronTrigger.setName(triggerName);
cronTrigger.setGroup(triggerGroup);
cronTrigger.setCronExpression(cron);
scheduler.scheduleJob(jobDetail,cronTrigger);
return "success";
}
}
Spring-task(最简易)
Maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
Service+JobBean合二为一
@Service
public class TaskService {
@Scheduled(cron = "0/5 * * * * ?")
public void sendEmail(){
System.out.println("hello world");
}
}
启动类加@EnableScheduling注解
@SpringBootApplication
@EnableScheduling
public class SpringTaskApp {
public static void main(String[] args) {
SpringApplication.run(SpringTaskApp.class,args);
}
}
结果:

总结
Quartz的初步入门就这么多啦~

7151

被折叠的 条评论
为什么被折叠?



