springboot整合定时器该怎么实现?有哪些方式?

TheDisguiser 2020-07-05 20:09:25 java常见问答 5064

Springboot现在几乎是项目都要配置,在项目中有时候会用到定时器,小伙伴们知道springboot要怎么整合定时器吗?有哪些方式呢?这就跟着小编来浏览浏览吧。

一般有着这三种常用方式:

一、使用Quartz定时器

1)、定义需要定时执行的方法类,并实现Job接口

/**
 * @ Author     :Zgq
 * @ Date       :Created in 11:47 2019/6/6
 * @ Description:定时器.创建要执行的方法
 * @ Modified By:
 * @Version: $
 */
public class MyJob implements Job
{
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException
    {
        // TODO Auto-generated method stub
        //需要定时执行的方法
        System.out.println("MyJob1");
    }
}

2)、把我们自己的方法加入Spring容器,就是写定时器中,这样就能够在项目运行时才看到效果

/**
 * @ Author     :Zgq
 * @ Date       :Created in 11:49 2019/6/6
 * @ Description:2.---->Quartz定时器
 * @ Modified By:
 * @Version: $
 */
@Configuration
public class QuartzConfig
{
    @Bean
    public JobDetail teatQuartzDetail1()
    {
        return JobBuilder.newJob(MyJob.class)
            .withIdentity("testQuartz1")
            .storeDurably()
            .build();
    }
    @Bean
    public Trigger testQuartzTrigger1()
    {
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
            .withIntervalInSeconds(9) //设置时间周期单位秒
            .repeatForever();
        return TriggerBuilder.newTrigger()
            .forJob(teatQuartzDetail1())
            .withIdentity("testQuartz1")
            .withSchedule(scheduleBuilder)
            .build();
    }
}

3)、在主程序运行该定时器

import java.text.ParseException;
import java.util.Date;
import java.util.Timer;
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;
import cn.test.quartz.MyJob;
import cn.test.quartz.Task;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
 * @author zgq
 * @version 创建时间:2019年1月25日 上午8:55:21 解释:
 */
public class Test
{
    public static void main(String[] args) throws Exception
    {
        // TODO Auto-generated method stub
        // 创建工作
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
            .withDescription("工作的描述")
            .withIdentity("工作的名称", "工作的组")
            .build();
        // 创建触发器
        Trigger trigger = TriggerBuilder.newTrigger()
            .withDescription("触发器的描述")
            .withIdentity("触发器的名称", "触发器的组")
            .withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?")) // "0/5 11 * ? * *"表达式
            .startAt(new Date()) // 不设置,默认为当前时间
            .build();
        // 创建调度器,粘合工作和触发器
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        scheduler.scheduleJob(jobDetail, trigger);
        // 启动调度器
        scheduler.start();
    }
}

二、使用@Scheduled注解

/**
 * @ Author     :Zgq
 * @ Date       :Created in 10:43 2019/6/6
 * @ Description:3.--->Scheduler定时器
 * @ Modified By:
 * @Version: $
 */
@Component
public class Scheduler
{
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    //每隔2秒执行一次
    @Scheduled(fixedRate = 5000)
    public void testTasks() throws Exception
    {
        System.out.println("定时任务执行时间:" + dateFormat.format(new Date()));
        /*new MailSender()
                .title("发送邮件")
                .content("test")
                .contentType(MailContentTypeEnum.TEXT)
                .targets(new ArrayList<String>(){{
                    add("***@qq.com");
                }})
                .send();*/
    }
    //每天3:05执行
    @Scheduled(cron = "0 05 03 ? * *")
    public void testTasks2()
    {
        System.out.println("定时任务执行时间:" + dateFormat.format(new Date()));
    }
}

三、使用TimerTask类中提供的定时方法

 public static void main(String[] args) throws java.io.IOException
 {
     TimerTask task = new TimerTask()
     {
         @Override
         public void run()
         {
             System.out.println("hello");
         }
     };
     Timer timer = new Timer();
     timer.schedule(task, 0, 5000); // 0标识   5000指延迟的时间5000毫秒
 }

以上就是关于springboot整合定时器所有内容,如果还有疑问,想知道更多java项目中常见问题及答案的话,就请持续关注本网站吧。

推荐阅读:

springboot session创建、销毁、超时、监听详解

springboot事务回滚要怎么配置?有几种方法?

springboot部署jar包到服务器上要如何部署?