springboot 定时任务
Quartz和springTask区别
在Quartz中,默认所有的定时任务都是并发去执行,无需等到上次任务是否执行完毕。
springtask默认单线程去执行定时任务,需要等待上一次任务执行完毕才会去执行下一个任务(要想让同一时间并发执行,要配线程池
)。
springtask组件
创建两个类,MyTask1、MyTask2。比如两个类都有push方法,让两个类的push方法每个五秒中去执行一次。
cron表达式可以在https://cron.qqe2.com/里参考。
/task/MyTask1.java
@Component
public class MyTask1 {private final Logger logger = LoggerFactory.getLogger(MyTask1.class);// @Scheduled注解是Spring Boot提供的用于定时任务控制的注解,表明这是一个需要定时执行的方法@Scheduled(cron = "0/5 * * * * ?")// 每隔五秒钟去执行一次这个方法public void push() {// 在这个方法里面定时的去推送消息logger.info("执行定时任务MyTask1"+Thread.currentThread().getName());//打印线程名称}
}
/task/MyTask2.java
@Component
public class MyTask2 {private final Logger logger = LoggerFactory.getLogger(MyTask2.class);@Scheduled(cron = "0/5 * * * * ?")public void push() {logger.info("执行定时任务MyTask2"+Thread.currentThread().getName());//打印线程名称}
}
另外,启动类需要加上注解 @EnableScheduling
,这个注解表示开启定时任务。
启动后可以发现,springtask组件实现的定时任务默认是一个线程同步执行的状态,即第一个任务执行完之后第二个任务才开始执行。
为了解决这个问题,可以使用线程池。
在两个push方法上面加上以在项目中配置好的线程beanId,比如@Async("threadPoolTaskExecutor")
。以及启动类加注解@EnableAsync
,表示开启线程池的异步执行。
执行定时任务MyTask1 test-thread1
执行定时任务MyTask2 test-thread2
执行定时任务MyTask1 test-thread3 // 五秒后...
执行定时任务MyTask2 test-thread4 // 五秒后...
...
如果springtask与线程池一起使用的话,可以让定时任务同一时间内异步执行。
如果开发环境和线上环境的定时时间不一样的话,可以在各环境配置文件里配置不同的值,在push方法里引入配置项就行。
Quartz组件
pom.xml
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
/quartz/QuartzTaks1.java
public class QuartzTaks1 extends QuartzJobBean{private final Logger logger = LoggerFactory.getLogger(QuartzTaks1.class);@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {// 执行定时任务logger.info("定时任务QuartzTaks1" + Thread.currentThread().getName());}
}
/quartz/QuartzTaks2.java
public class QuartzTaks2 extends QuartzJobBean{private final Logger logger = LoggerFactory.getLogger(QuartzTaks2.class);@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {// 执行定时任务logger.info("定时任务QuartzTaks2" + Thread.currentThread().getName());}
}
/quartz/JobConfig.java
@Configuration
public class JobConfig {@Beanpublic JobDetail quartzTaks1JobDetail() {// 任务实例(JobDetail)//表示去启动QuartzTaks1定时任务,并给他一个标识,比如类名。withIdentity:任务的名称(唯一实例)return JobBuilder.newJob(QuartzTaks1.class).withIdentity(QuartzTaks1.class.getName()).build();}// 创建调度器(trigger是触发器,任务何时运行、运行几次,它说了算。)@Beanpublic Trigger quartzTrigger() {CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ? ");return TriggerBuilder.newTrigger().forJob(QuartzTaks1.class.getName()).withSchedule(cronScheduleBuilder).storeDurably() //表示开启任务持久化.build();}@Beanpublic JobDetail quartzTaks2JobDetail() {//表示去启动QuartzTaks1定时任务,并给他一个标识return JobBuilder.newJob(QuartzTaks2.class).withIdentity(QuartzTaks2.class.getName()).build();}// 创建调度器@Beanpublic Trigger quartzTrigger() {CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ? ");return TriggerBuilder.newTrigger().forJob(QuartzTaks2.class.getName()).withSchedule(cronScheduleBuilder).storeDurably() //表示开启任务持久化.build();}
}
运行之后,可以看到每个五秒输出信息:
定时任务QuartzTaks2:QuartzSchedule_Worker-1
定时任务QuartzTaks1:QuartzSchedule_Worker-2
定时任务QuartzTaks2:QuartzSchedule_Worker-3 // 五秒后
定时任务QuartzTaks1:QuartzSchedule_Worker-4 // 五秒后
...
可以看到两个定时任务并发执行,线程名称也都不一样。
需要注意的是,MyTask1类的定时任务方法上(push)加@Transactional的话,会导致事务失效,正确的做法应该是将把多表操作的代码放到service里面去,比如放在test方法里面,然后把@Transactional加到service的test方法上,在push方法上去调用service的test方法就行。只有这样,才能让事务成功执行。
springboot 定时任务相关推荐
- SpringBoot定时任务实现的两种方式介绍
今天给大家介绍SpringBoot定时任务实现的几种方式,希望对大家能有所帮助! 1.SpringTask 用法 框架介绍:SpringTask是Spring自带的轻量级定时任务工具,相比于Quart ...
- 开关配置springboot定时任务
题外话 这是我第五篇原创文章,计划写定时任务内容,想想只要打开自己的有道云笔记,复制粘贴,整理排版一下就能轻松搞定了,这样做有意义吗?自己写文章的价值点是什么呢?考虑了很长时间,主要希望做到一下几点: ...
- SpringBoot定时任务(@Scheduled)说明
转载文章:http://blog.csdn.net/loongshawn/article/details/50663393 1. 定时任务实现方式 定时任务实现方式: Java自带的java.util ...
- springBoot 定时任务执行一段时间后失效
问题描述: springBoot 定时任务执行一段时间后失效,定时任务调用http过一段时间后什么异常也没有 原因:http请求僵死,导致线程也不往下执行,最终导致后面的定时任务也不执行: 解决方法: ...
- SpringBoot定时任务简单应用
SpringBoot定时任务可以用于周期性重复工作的编写,其应用简单,能满足绝大多数需求.在Java中实现定时任务主要有三种实现形式:一是使用JDK 自带的 Timer,二是使用第三方组件 Quart ...
- SpringBoot定时任务 - 集成quartz实现定时任务(单实例和分布式两种方式)
最为常用定时任务框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不仅支持单实例方式还支持分布式方式.本文主要介绍Quartz,基础的Quartz的集成案例本,以及实现基于数 ...
- SpringBoot 定时任务的实现
介绍两种实现方式:配置实现和读取数据库定时任务配置实现. 配置实现比较简单.直接撸代码: package com; import java.util.Properties; import org.ap ...
- springboot定时任务未登录情况下获取用户信息报错解决方案
解决org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling ...
- SpringBoot定时任务升级篇(动态添加修改删除定时任务)
(1)思路说明: (a)首先这里我们需要重新认识一个类ThreadPoolTaskScheduler:线程池任务调度类,能够开启线程池进行任务调度. (b)ThreadPoolTaskSchedule ...
- Java 实现 Springboot 定时任务(每隔一段时间自动执行一次)
Java实现非Web项目的Springboot定时任务(每3秒自动执行一次) 前言 一.新建Java Springboot项目 二.示例代码 运行效果 总结 前言 运行非Web的Springboot项 ...
最新文章
- Java组合实体模式
- Eclipse中,多参列表光标跳转至第2个参数快捷键,及其他常用快捷键
- 九、Docker快速搭建Elastic Stack(上篇)
- 浅说深度学习(1):核心概念
- 測试AtomicInteger与普通int值在多线程下的递增操作
- JAVA基础知识(13)-----Lock接口
- PAT 乙级 1014. 福尔摩斯的约会 (20) Java版
- 定义工作,解读自我——IT帮2019年2月线下活动回顾
- lufylegend库 鼠标事件 循环事件 键盘事件
- HTML中想要看见盒子的边框,盒子边框装饰
- 2017最新xcode打包APP详细图文
- MYSQL存储过程的简单运用,包括传值、返回值、返回集合
- JAVA 三种方式计算1加到100的结果
- 电商购物评论的情感分析
- 防火墙互联网的几种接入方式
- 开源网络情报(OSINT)定义:对您的企业意味着什么
- Chrome插件扩展程序的默认安装目录
- 我们真的不需要35岁以上的项目经理吗
- 云集品以共享经济为幌子因涉及传销被关闭,做社交电商防止误入
- forever warn: --minUptime not set. Defaulting to: 1000ms
热门文章
- 将excel中的表快速复制粘贴进word中且不变形
- oracle时间相关函数
- android 通过sheme打开activity
- ConcurrentHashMap中的散列算法有什么含义
- js 遍历 JSON数据
- 【Linux】 Shell循环
- 下载eclipse出现a java_打开Eclipse弹出“No java virtual machine was found...的解决方法
- 旁观电子商务——运费之争背后的价格战
- 用计算机语言写结婚祝福语,抖音很火的结婚祝福语 祝福新人的唯美句子
- redhat linux基础(2)修改主机名,调换网络模式并使用ssh连接,并总结