栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring-shiro-Boot-13 Quartz-调度

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring-shiro-Boot-13 Quartz-调度

完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。相较于Timer, Quartz增加了很多功能:1、持久性作业 - 就是保持调度定时的状态。2、作业管理 - 对调度作业进行有效的管理。

一、Quartz API核心接口有:

Scheduler – 与scheduler交互的主要API;Job – 你通过scheduler执行任务,你的任务类需要实现的接口;JobDetail – 定义Job的实例;Trigger – 触发Job的执行;JobBuilder – 定义和创建JobDetail实例的接口;TriggerBuilder – 定义和创建Trigger实例的接口; 二、Job 和 Trigger

  public interface Job {

    public void execute(JobExecutionContext context)throws JobExecutionException;

  }

(1)job的execute(context)方法被scheduler的一个工作线程调用。

(2) Job和Trigger的区别:

很多任务调度器并不区分 Job 和 Trigger。

Quartz做了区分,简单的说就是把触发条件和执行任务区分开来。这种做法使得Job可以独立于Trigger之外存储在scheduler中。当然,多个触发器也可以被绑定到一个Job。当一个Trigger过期之后,可以重新复用和这个Trigger绑定的Job。

(3)JobDetail:

JobDetail对象是在被添加到调度器的时候被Quartz客户端(也就是你的程序)创建的。用来存储一个 Job的状态信息。

            public interface JobDetail {
                JobKey getKey();
                String getDescription();
                JobDataMap getJobDataMap();
            }
        JobKey jobKey = JobKey.jobKey(name);
		JobDetail jobDetail = JobBuilder.newJob(SpringBeanJob.class)
                                .storeDurably()
				                .withDescription(jobModel.getDescription())
                                .withIdentity(jobKey).build();

(4)JobDataMap

存储job的数据,相当于job的HashMap。将job加入到scheduler之前,在构建JobDetail时,可以将数据放入JobDataMap。

//创建job时候后,在jobMap中存 
 JobDetail job = newJob(DumbJob.class)
      .withIdentity("myJob", "group1") // name "myJob", group "group1"
      .usingJobData("jobSays", "Hello World!")
      .usingJobData("myFloatValue", 3.141f)
      .build();


//job执行过程中,使用jobMap中数据
public class DumbJob implements Job {

    public DumbJob() {
    }

    public void execute(JobExecutionContext context)
      throws JobExecutionException
    {
      JobKey key = context.getJobDetail().getKey();
      JobDataMap dataMap = context.getJobDetail().getJobDataMap();
      String jobSays = dataMap.getString("jobSays");
      float myFloatValue = dataMap.getFloat("myFloatValue");

    }
  }

(4)Trigger:

触发器对象用来触发一个Job的执行。当你想要调度一个Job的时候,你需要实例化一个触发器并将它的触发时间调整到你希望的时间点。触发器也可以有和他们关联的JobDataMap(当多个触发器会触发同一个Job,但是需要向这个Job传递不同的data时特别有用)。Quartz框架有很多种触发器,最常用的是SimpleTrigger和CronTrigg。

(5)key

将 Job 和 Trigger 注册到 Scheduler 时,可以为它们设置 key,相当于ID。

三、Quartz生命流程

scheduler是quartz的调度器入口。

创建:chedulerFactory创建。

添加:【build】后可以向这个调度器添加、删除Job和Trigger。

开始:【strart】start方法不被调用,绑定到他上面的Trigger和Job都不会生效。

结束:【shutdown】结束。

 // define the job and tie it to our HelloJob class
  JobDetail job = newJob(HelloJob.class)
      .withIdentity("myJob", "group1") // name "myJob", group "group1"
      .build();
 
  // Trigger the job to run now, and then every 40 seconds
  Trigger trigger = newTrigger()
      .withIdentity("myTrigger", "group1")
      .startNow()
      .withSchedule(simpleSchedule()
          .withIntervalInSeconds(40)
          .repeatForever())            
      .build();
 
  // Tell quartz to schedule the job using our trigger
  sched.scheduleJob(job, trigger);

四、springboot中配置quartz

 (1)引入jar

		
			org.quartz-scheduler
			quartz
		

(2)定义业务job

public class SpringBeanJob extends QuartzJobBean {

	@Override
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
		try {
			//根据KEY获取spring上下文
			ApplicationContext applicationContext = (ApplicationContext) context.getScheduler().getContext()
					.get(JobConfig.KEY);
			//获取服务
			JobService jobService = applicationContext.getBean(JobService.class);
			jobService.doJob(context.getJobDetail().getJobDataMap());
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}

(3)配置quartzScheduler【线程池+JobStore+DataSources】


@Configuration
public class JobConfig {

	public static final String KEY = "applicationContextSchedulerContextKey";
	
	@Bean("adminQuartzScheduler")
	public SchedulerFactoryBean quartzScheduler(DataSource dataSource) {
		// Spring提供SchedulerFactoryBean为Scheduler提供配置信息,并被Spring容器管理其生命周期
		SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean();

		try {
	    //设置quartz的配置文件,加载quartzScheduler参数
			quartzScheduler.setQuartzProperties(
					PropertiesLoaderUtils.loadProperties(new ClassPathResource("quartz.properties")));
		} catch (IOException e) {
			e.printStackTrace();
		}
		//设置数据源(使用系统的主数据源,覆盖propertis文件的dataSource配置)
		quartzScheduler.setDataSource(dataSource);
		//启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
		quartzScheduler.setOverwriteExistingJobs(true);
		quartzScheduler.setApplicationContextSchedulerContextKey(KEY);
		// 延时启动(秒)
		quartzScheduler.setStartupDelay(10);

		return quartzScheduler;
	}


}

(4)设置参数

org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5

org.quartz.jobStore.misfireThreshold = 60000
#JobStoreTX作为JobStore 来管理事务
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#使用表前缀配置JDBCJobStore
org.quartz.jobStore.tablePrefix = QRTZ_
  
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 15000

(5)设置具体JobService

public interface JobService {

	void saveJob(JobModel jobModel);

	void doJob(JobDataMap jobDataMap);

	void deleteJob(Long id) throws SchedulerException;
}

(6)实现

具体实现,下一章节单独完成。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/786019.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号