定时任务

定时任务场景:

  数据同步,交易信息,定时发送数据,活动推送 

  主题:分布式任务调度平台分布式领域中集群的话,保证定时Job幂等性   

 

Java定时job方案:

  Thread  TimerTast 线程池 quartz SpringBoot 内置schedul

1、Thread:

package com.toov5.JobTest;

public class Demo01 {
   
    static long count = 0;
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            
            @Override
            public void run() {
            while (true) {
                try {
                    Thread.sleep(1000);
                    count++;
                    System.out.println(count);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
                
            }
        };
        
        Thread thread = new Thread(runnable);
        thread.start();
    }
     
    
}

TimerTask

package com.toov5.JobTest;

import java.util.Timer;
import java.util.TimerTask;

public class Demo02 {
    
    private static int count = 0;
    
    public static void main(String[] args) {
        //属于JDK自带的 util包里的哦
    TimerTask timerTask    = new TimerTask() {
            
            @Override
            public void run() {
                System.out.println(++count); 
                
            }
        };
        //定义触发规则
        Timer timer = new Timer();
        //天数
        long delay = 0;  //0表示任意的
        long period = 1000;
        timer.scheduleAtFixedRate(timerTask, delay, period);
    }
    
}

线程池:

package com.toov5.JobTest;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Demo03 {
    private static int count = 0;

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {

            @Override
            public void run() {
                System.out.println(++count);

            }
        };
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        service.scheduleAtFixedRate(runnable, 1, 1, TimeUnit.SECONDS);

    }

}

Quartz: http://cron.qqe2.com/

package com.toov5.quartz;

import java.util.Date;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class TestJob {
     public static void main(String[] args) throws SchedulerException {
         //1.创建Scheduler的工厂
         SchedulerFactory sf = new StdSchedulerFactory();
         //2.从工厂中获取调度器实例
         Scheduler scheduler = sf.getScheduler();


         //3.创建JobDetail  Job的详细信息  制定哪个job的
         JobDetail jb = JobBuilder.newJob(MyJob.class)
                 .withDescription("this is a ram job") //job的描述
                 .withIdentity("ramJob", "ramGroup") //job 的name和group
                 .build();

         //任务运行的时间,SimpleSchedle类型触发器有效
         long time=  System.currentTimeMillis() + 3*1000L; //3秒后启动任务
         Date statTime = new Date(time);

         //4.创建Trigger
             //使用SimpleScheduleBuilder或者CronScheduleBuilder
         Trigger t = TriggerBuilder.newTrigger()
                     .withDescription("")
                     .withIdentity("ramTrigger", "ramTriggerGroup")
                     //.withSchedule(SimpleScheduleBuilder.simpleSchedule())
                     .startAt(statTime)  //默认当前时间启动
                     .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) //两秒执行一次
                     .build();

         //5.注册任务和定时器
         scheduler.scheduleJob(jb, t);

         //6.启动 调度器
         scheduler.start();

    }
}

要跑的业务:

package com.toov5.quartz;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyJob implements Job {
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //定时任务的 业务
        System.out.println("quartz MyJob date:" + new Date().getTime());
    }
}

每隔2s执行一次:

 

posted @ 2018-11-09 00:39  toov5  阅读(272)  评论(0编辑  收藏  举报