quartz定时任务以及自动创建订单

基本概述

Quartz是一个完全由java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间
Quartz框架主要核心组件包括调度器、触发器、作业。调度器作为作业的总指挥,触发器作为作业的操作者,作业为应用的功能模块。其关系如下图所示
在这里插入图片描述
Job为作业的接口,为任务调度的对象;JobDetail用来描述Job的实现类及其它相关的静态信息;Trigger为作业的定时管理工具,一个Trigger只能对应一个作业实例,而一个作业实例可对应多个触发器;Scheduler为定时任务容器,为quartz最上层的东西,它提携了所有触发器和作业,使它们协调工作,每个Scheduler都存有JobDetail和Trigger的注册,一个Scheduler中可以注册多个JobDetail和多个Trigger。

简单实现定时任务

先创建一个job类,job类包含具体的业务实现,再创建一个测试类,测试类中包含Trigger触发器和scheduler调度器

public class FirstJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDetail jobDetail = context.getJobDetail();
        //获取工作的名称
        String name = jobDetail.getKey().getName();//任务名
        String group = jobDetail.getKey().getGroup();//任务组
        String data = jobDetail.getJobDataMap().getString("data");//任务中的数据
        //业务
        System.out.println("job执行,job名:"+name+"job组:"+group+"数据:"+data+new Date());
    }
}
public class QuartzTest {
    public static void main(String[] args) {
        try{
            //创建scheduler调度器
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            //定义一个Trigger,触发条件类
            TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger();
            triggerBuilder.withIdentity("trigger1","group1")//定义name和group
                          .startNow()//一旦加入scheduler立即生效
                          .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                                                             .withIntervalInSeconds(1)//每隔一秒执行一次
                                                             .repeatForever());//一直执行,直到结束时间
                          //可以设置结束时间,如果不设置,则一直执行
                          //.endAt(new GregorianCalendar(2020,4,25,12,0,0).getTime());
            Trigger trigger = triggerBuilder.build();
            //定义一个Jobdetail
            //定义job类为Firstjob类,业务逻辑所在
            JobDetail jobDetail = JobBuilder.newJob(FirstJob.class)
                    .withIdentity("测试任务1","test")//定义name和group
                    .usingJobData("data","jobdata")//定义属性,存储数据
                    .build();
            //调度器中加入任务和触发器
            scheduler.scheduleJob(jobDetail,trigger);
            //启动任务调度
            scheduler.start();
            //睡一会
            Thread.sleep(6000);
            //关闭任务调度器
            scheduler.shutdown();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

测试结果
在这里插入图片描述

Spring整合quartz

<!-- 1.配置Job作业 -->
<bean id="appJob01"  class="com.offcn.jobs.AppJob01"></bean>

 <!--2.配置JobDetailed -->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	<property name="targetObject" ref="appJob01" />
	<property name="targetMethod" value="printHelloWord" />
</bean>

<!--3.配置trigger触发器 -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
	<!-- see the example of method invoking job above -->
	<property name="jobDetail" ref="jobDetail" />
	<!-- 10 seconds -->
	<property name="startDelay" value="10000" />
	<!-- repeat every 50 seconds -->
	<property name="repeatInterval" value="50000" />
</bean>

<!-- 4.配置 sheduler容器-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	<property name="triggers">
		<list>
			<ref bean="simpleTrigger" />
		</list>
	</property>
</bean>

加载spring的配置文件:在main方法里面加载配置文件:

 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-quartz.xml");

执行main方法,调度器开始执行

实现自动创建订单功能

使用quartz,但是不使用spring容器管理。
1、创建一个job,需要注入service类(前提需要加上一段代码SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);)参考自添加链接描述

@Component
public class OrderJob implements Job {
    @Autowired
    private OrderService orderService;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("测试数据!");
        try {
            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
            orderService.AutoCreateOrder();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

2、创建一个controller

@Controller
public class QuartzController {

    private Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

    //无参构造器
    public QuartzController() throws SchedulerException {
        scheduler.start();
    }
    @RequestMapping("/admin/order/auto")
    @ResponseBody
    public String startAuto() throws SchedulerException {
        addOrderJob();
        return "OK";
    }
    @RequestMapping("/admin/order/close")
    @ResponseBody
    public String closeAuto() throws SchedulerException {
        scheduler.pauseTrigger(TriggerKey.triggerKey("trigger1","group1"));
        scheduler.deleteJob(JobKey.jobKey("autoCreateOrder","order"));
        //scheduler.shutdown();
        return "OK";
    }
    public void addOrderJob() throws SchedulerException {
        //定义一个Trigger,触发条件类
        TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger();
        triggerBuilder.withIdentity("trigger1","group1")//定义name和group
                .startNow()//一旦加入scheduler立即生效
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(3)//每隔一秒执行一次
                        .repeatForever());//一直执行,直到结束时间
        //可以设置结束时间,如果不设置,则一直执行
        //.endAt(new GregorianCalendar(2020,4,25,12,0,0).getTime());
        Trigger trigger = triggerBuilder.build();
        //定义一个Jobdetail
        //定义job类为Firstjob类,业务逻辑所在
        JobDetail jobDetail =JobBuilder.newJob(OrderJob.class)
                .withIdentity("autoCreateOrder","order")//定义name和group
                .build();
        //调度器中加入任务和触发器
        scheduler.scheduleJob(jobDetail,trigger);
    }
}

注意:

  • 开启与关闭自动创建订单是通过添加/删除job来实现的,start与shutdown并不能实现多次的开启与关闭,只能实现一次开启/关闭,第二次就会报出异常
  • scheduler的开启是通过无参构造器开启的,当这个类被初始化的时候,scheduler就已经开启了
  • scheduler.pauseTrigger(TriggerKey.triggerKey(“trigger1”,“group1”));暂停触发器
  • scheduler.deleteJob(JobKey.jobKey(“autoCreateOrder”,“order”));删除指定job
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值