SpringBoot定时任务两种(Spring Schedule 与 Quartz 整合 )实现方法

作者:JavaNoob 时间:2023-11-01 16:03:39 

前言

最近在项目中使用到定时任务,之前一直都是使用Quartz 来实现,最近看Spring 基础发现其实Spring 提供 Spring Schedule 可以帮助我们实现简单的定时任务功能。

下面说一下两种方式在Spring Boot 项目中的使用。

Spring Schedule 实现定时任务

Spring Schedule 实现定时任务有两种方式 1. 使用XML配置定时任务, 2. 使用 @Scheduled 注解。 因为是Spring Boot 项目 可能尽量避免使用XML配置的形式,主要说注解的形式.

Spring Schedule 提供三种形式的定时任务:

固定等待时间 @Scheduled(fixedDelay = 时间间隔 )


@Component
public class ScheduleJobs {
 public final static long SECOND = 1 * 1000;
 FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");

@Scheduled(fixedDelay = SECOND * 2)
 public void fixedDelayJob() throws InterruptedException {
   TimeUnit.SECONDS.sleep(2);
   System.out.println("[FixedDelayJob Execute]"+fdf.format(new Date()));
 }
}

固定间隔时间 @Scheduled(fixedRate = 时间间隔 )


@Component
public class ScheduleJobs {
 public final static long SECOND = 1 * 1000;
 FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");

@Scheduled(fixedRate = SECOND * 4)
 public void fixedRateJob() {
   System.out.println("[FixedRateJob Execute]"+fdf.format(new Date()));
 }
}

Corn表达式 @Scheduled(cron = Corn表达式)


@Component
public class ScheduleJobs {
 public final static long SECOND = 1 * 1000;
 FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");

@Scheduled(cron = "0/4 * * * * ?")
 public void cronJob() {
   System.out.println("[CronJob Execute]"+fdf.format(new Date()));
 }
}

Spring Boot 整合 Quartz 实现定时任务

添加Maven依赖


   <dependency>
     <groupId>org.quartz-scheduler</groupId>
     <artifactId>quartz</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context-support</artifactId>
   </dependency>

Spring Boot 整合 Quartz

Spring 项目整合 Quartz 主要依靠添加 SchedulerFactoryBean 这个 FactoryBean ,所以在maven 依赖中添加 spring-context-support 。

首先添加 QuartzConfig 类 来声明相关Bean


@Configuration
public class QuartzConfig {
 @Autowired
 private SpringJobFactory springJobFactory;

@Bean
 public SchedulerFactoryBean schedulerFactoryBean() {
   SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
   schedulerFactoryBean.setJobFactory(springJobFactory);
   return schedulerFactoryBean;
 }

@Bean
 public Scheduler scheduler() {
   return schedulerFactoryBean().getScheduler();
 }
}

这里我们需要注意 我注入了一个 自定义的JobFactory ,然后 把其设置为SchedulerFactoryBean 的 JobFactory。其目的是因为我在具体的Job 中 需要Spring 注入一些Service。

 所以我们要自定义一个jobfactory, 让其在具体job 类实例化时 使用Spring 的API 来进行依赖注入。

SpringJobFactory 具体实现:


@Component
public class SpringJobFactory extends AdaptableJobFactory {

@Autowired
 private AutowireCapableBeanFactory capableBeanFactory;

@Override
 protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
   Object jobInstance = super.createJobInstance(bundle);
   capableBeanFactory.autowireBean(jobInstance);
   return jobInstance;
 }
}

具体使用 (摘取自项目代码):


@Service
public class QuartzEventServiceImpl implements QuartzEventService {
 private static final String JOB_GROUP = "event_job_group";
 private static final String TRIGGER_GROUP = "event_trigger_group";
 @Autowired
 private Scheduler scheduler;

@Override
 public void addQuartz(Event event) throws SchedulerException {
   JSONObject eventData = JSONObject.parseObject(event.getEventData());
   Date triggerDate = eventData.getDate("date");
   JobDetail job = JobBuilder.newJob(EventJob.class).withIdentity(event.getId().toString(), JOB_GROUP).usingJobData(buildJobDateMap(event)).build();
   Trigger trigger = TriggerBuilder.newTrigger().withIdentity(event.getId().toString(), TRIGGER_GROUP).startAt(triggerDate).build();
   scheduler.scheduleJob(job, trigger);
 }

来源:http://www.cnblogs.com/javanoob/p/springboot_schedule.html

标签:spring,boot,定时
0
投稿

猜你喜欢

  • java 使用foreach遍历集合元素的实例

    2022-11-17 09:24:58
  • c++与c#的时间转换示例分享

    2022-08-22 07:21:40
  • Java中CyclicBarrier和CountDownLatch的用法与区别

    2021-09-09 08:20:01
  • C#利用原图和水印图的重叠简单实现水印的方法

    2023-04-21 01:41:24
  • Android实现签名涂鸦手写板

    2022-07-27 04:10:14
  • WCF实现的计算器功能实例

    2022-05-07 23:17:12
  • unity制作瞄准镜效果

    2022-04-15 23:45:10
  • 详解maven的setting配置文件中mirror和repository的区别

    2022-03-19 11:56:42
  • c#读取文件详谈

    2023-03-04 14:47:30
  • Java详细分析String类与StringBuffer和StringBuilder的使用方法

    2022-04-23 15:23:30
  • android的消息处理机制(图文+源码分析)—Looper/Handler/Message

    2023-01-04 08:04:15
  • JAVA 内存溢出案例汇总

    2022-02-16 08:49:22
  • android调用国家气象局天气预报接口json数据格式解释

    2022-09-16 21:08:24
  • SWT(JFace) 文本编辑器 实现代码

    2023-01-27 22:39:37
  • c# 深拷贝与浅拷贝的区别分析及实例

    2023-06-29 05:00:06
  • Java使用自定义注解实现为事件源绑定事件监听器操作示例

    2023-06-21 01:17:55
  • Android:Field can be converted to a local varible.的解决办法

    2022-01-23 16:53:14
  • C#多线程及同步示例简析

    2022-02-25 22:12:43
  • Flutter runApp到渲染上屏分析详解

    2023-06-27 12:09:45
  • android自定义环形对比图效果

    2023-06-15 19:49:19
  • asp之家 软件编程 m.aspxhome.com