quartz

Spring Boot 中使用 Quartz 实现任务调度

拟墨画扇 提交于 2020-12-26 00:54:54
Quartz 概述 Quartz 是 OpenSymphony 开源组织在 Job Scheduling 领域又一个开源项目,它可以与 J2EE、 J2SE 应用程序相结合也可以单独使用。 Quartz 可以用来创建简单或为运行十个,百个,甚至是好几万个 Jobs 这样复杂的程序。Jobs 可以做成标准的 Java 组件或 EJBs。 Quartz 使用场景 Quartz 是一个任务调度框架。比如你遇到这样的问题: 每天 01:00 发送一份工作邮件给工作组成员并抄送给老板(假装自己很努力的工作到深夜) 每月 2 号提醒自己还信用卡或自动还款 每秒钟发 N 笔脏数据给竞争对手公司的服务器 ...... 这些问题总结起来就是:在某一个有规律的时间点干某件事。并且时间的触发的条件可以非常复杂,复杂到需要一个专门的框架来干这个事。 Quartz 就是来干这样的事,你给它一个触发条件的定义,它负责到了时间点,触发相应的 Job 起来干活。 cron 表达式 cron 是 Linux 系统用来设置计划任务的,比如:每天晚上 12 点重启服务器。 一个 cron 表达式具体表现就是一个字符串,这个字符串中包含 6~7 个字段,字段之间是由空格分割的,每个字段可以由任何允许的值以及允许的特殊字符所构成,下面表格列出了每个字段所允许的值和特殊字符。 字段 允许值 允许的特殊字符 秒 0-59 ,

Quartz那点事儿

瘦欲@ 提交于 2020-12-19 14:32:28
初识 官方文档对Quartz的描述: Quartz是一个拥有丰富特性,开源的作业调度类库。小到独立的java应用程序,大到电子商务系统都可以将Quartz整合到其中。Quartz可以创建简单或者复杂的调度程序来执行作业,而作业作为java的组件来执行你希望实现的任何功能。 我的描述:Quartz就是在对的时间做对的事。 再看 在Quartz官网下载了他的文档,有好几篇,看着也真是够够的了。其实我认为只需要了解三个核心的内容,就可以对Quartz进行使用了。三个核心内容是什么呢?作业,触发器,调度程序。下面我们依次聊聊这三项。 作业(Job) 作业就是你希望在对的时间做什么事。在Quartz中作业的定义很简单,只需要实现Job接口,并实现它的execute方法就可以定义你希望做的事情。 例如: public class HelloJob implements Job { Logger logger=LoggerFactory.getLogger(HelloJob.class); @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { logger.info("Hello World:"+new Date()); } } 关于作业的存储

超详细,理解这6个核心概念,轻松入门Java多线程!

走远了吗. 提交于 2020-12-19 00:00:25
前言 小编这里整理了一份JAVA多线程并发编程的详细思维导图,想了解的小伙伴可以点开看看呢。 多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关重要。 小编接下来会从基础概念开始到最后的并发模型由浅入深,讲解下线程方面的知识。 一、并发与并行 并行,表示两个线程同时做事情。 并发,表示一会做这个事情,一会做另一个事情,存在着调度。单核 CPU 不可能存在并行(微观上)。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。 阻塞与非阻塞 阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。 此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。阻塞是指线程在操作系统层面被挂起。阻塞一般性能不好,需大约8万个时钟周期来做调度。 非阻塞则允许多个线程同时进入临界区。 二、锁 死锁 死锁是进程死锁的简称,是指多个进程循环等待他方占有的资源而无限的僵持下去的局面。

CGContextRef&CGMutablePathRef&UIBezierPath简单学习

我与影子孤独终老i 提交于 2020-12-18 03:14:29
简单的四句介绍 Quartz 是一个二维绘图引擎,使用的是CoreGraphics库,同时支持iOS和Mac系统 CGContextRef :获取图形上下文.或者叫作用域,即画布,他是专门用来保存绘画期间的各种数据的 UIBezierPath 是对CGPathRef的封装。创建矢量图形时,拆解成一条或者多条线段,拼接起来,每条下端的终点都是下一条线段的起点 当我们绘制路径时,Path的信息就会被Graphics context重置。 如果我们想要保存path信息,并多次使用它,我们就可以用到CGPathCreatMutable申请路径,然后用CGPathAddLintToPoint等方法来添加路径。 一起学习,共同进步, 可下载对应Demo 1.设置点和线 介绍属性 先设置一个起点 添加一个中间点 画一个矩形 画一个圆形 画一个扇形 二阶曲线 三阶曲线 CGContextRef UIBezierPath CGMutablePathRef CGContextMoveToPoint moveToPoint CGPathMoveToPoint CGContextAddLineToPoint addLineToPoint CGPathAddRect CGContextAddRect bezierPathWithRect CGPathAddRect

Java动态创建与修改定时任务

爱⌒轻易说出口 提交于 2020-12-14 01:20:37
  最近遇到一个需求,需要能够按照特定的配置执行定时任务,而且定时任务需要在应用不重启的情况下动态增删改,Spring提供的 @Scheduled 注解是硬编码形式,只能实现固定的定时任务,随后经过一番探究,依托注明的quartz框架终于实现了该功能,下面来分享一下我的方案。 首先引入quartz maven依赖: <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <!-- 由于我的项目继承了spring-boot-starter-parent,因此这里可以不用写版本号,会直接使用父pom文档中dependencyManagement的quartz版本号 --> <!-- <version>2.3.2</version> --> </dependency> 我的定时任务配置是存储在MySQL数据库当中的,当程序启动时,初始化过程会的 init() 方法会读取一遍所有有效的定时任务配置,然后将其实例化为一个个对象,一个对象便代表了一个定时任务,我定义的类为 public class ScheduledClauseTriggerEngine implements ClauseTriggerEngine<Void>, Job, AutoCloseable ,其中

推荐一个基于 SpringBoot2 + MybatisPlus 的商城管理系统

女生的网名这么多〃 提交于 2020-12-11 17:43:05
项目简介 SpringBoot2+MybatisPlus+SpringSecurity+jwt+redis+Vue 的前后端分离的商城系统, 包含商城、拼团、砍价、商户管理、 秒杀、优惠券、积分、分销、会员、充值、多门店等功能,更适合企业或个人二次开发。 商城功能 商品模块:商品添加、规格设置,商品上下架等 订单模块:下单、购物车、支付,发货、收货、评价、退款等 营销模块:积分、优惠券、分销、砍价、拼团、秒杀、多门店等 微信模块:自定义菜单、自动回复、微信授权、图文管理、模板消息推送 配置模块:各种配置 用户模块:登陆、注册、会员卡、充值等 其他等 项目结构 项目采用分模块开发方式 yshop-weixin 微信相关模块 yshop-common 公共模块 yshop-admin 后台模块 yshop-logging 日志模块 yshop-tools 第三方工具模块 yshop-generator 代码生成模块 yshop-shop 商城模块 yshop-mproot mybatisPlus 系统预览 技术选型 后端使用技术 1.1 SpringBoot2 1.2 mybatis、MyBatis-Plus 1.3 SpringSecurity 1.5 Druid 1.6 Slf4j 1.7 Fastjson 1.8 JWT 1.9 Redis 1.10 Quartz 1.11

Java并发编程:Java实现多线程的几种方式

元气小坏坏 提交于 2020-12-06 19:14:38
在Java中,多线程主要的实现方式有四种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,而后两种是带返回值的。除此之外,通过Timer启动定时任务,或者通过像Spring Task和quartz这样的第三方任务调度框架也可以开启多线程任务。 1、继承Thread类 创建线程 Thread类本质上也是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程比较简单,通过继承Thread类并复写run()方法,就可以启动新线程并执行自己定义的run()方法。 CreateThreadDemo1.java public class CreateThreadDemo1 extends Thread { public CreateThreadDemo1(String name) { // 设置当前线程的名字 this .setName(name); } @Override public void run() {

Quartz.Net实现作业定时调度详解

☆樱花仙子☆ 提交于 2020-11-25 06:47:41
1、Quartz.NET介绍 Quartz.NET是一个强大、开源、轻量的作业调度框架,你能够用它来为执行一个作业而创建简单的或复杂的作业调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。 Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。 官网: http://www.quartz-scheduler.net/ 源码: https://github.com/quartznet/quartznet 示例: https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html Quartz.NET是一个强大、开源、轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和Web应用中。它灵活而不复杂,你能够用它来为执行一个作业而创建简单的或复杂的作业调度。Quartz.NET 3.0 已经开始支持 .NET Core/.NET Standard 2.0。

定时调度系列之Quartz.Net详解

孤街浪徒 提交于 2020-11-25 06:30:28
一. 背景    我们在日常开发中,可能你会遇到这样的需求:"每个月的3号给用户发信息,提醒用户XXX "、"每天的0点需要统计前一天的考勤记录"、"每个月的1号计算上个月的库存情况"、"定时初始化数据供其它业务使用"、"每隔2分钟轮询查数据库看某业务是否被审核通过,并提示用户" 等等。   以上需求在开发中都非常常见,但它们仅仅属于低端一点的需求,稍高端一点的需求比如:" 客服派车给调度,如果调度3天内没有执行任何操作,需要提示调度要抓紧派车了 ",到这一步为止看起来和上面的需求并没有什么两样,但如果我要求,系统管理员可以动态配置提示时间呢?即管理员可以配置调度几天没有执行任何操作,系统需要给出提示。这么一改的话,对于一些新手而已,难度就陡然上升了。   下面我们接着升级需求,系统中有A、B、C、D。。。。等等多个业务,系统管理员可以动态配置每个业务的执行时间情况(如:每隔2s执行一次、每月3号执行一次等等),并且可以动态的控制每个业务的开启、关闭、暂停、全部关闭、全部暂停等。需求升级到这个程度,估计新手就抓虾了,有一定经验的人但是没有接触过类似框架,面对这样的需求,也需要一点时间去研究。 解惑:   需求1:也就是我们常说的定时任务,简答一点的可以借助Timer类来实现,对时间要求复杂的需要借助第三方的框架来实现,如:Quartz.Net.   需求2

【原创】我还是很建议你用DelayQueue搞定超时订单的(1)

北城以北 提交于 2020-11-22 13:22:36
【原创】我还是很建议你用DelayQueue搞定超时订单的(1) 我就是那个人见人爱的 锦成同学,我是java进阶架构师社区的特邀作者, 今天为大家带来新的一篇小知识,祝各位宝宝能学到新知识...更上一层楼..... 一、用三根鸡毛做引言 真的! 不骗你们的喔~ 相信大家都遇到类似于:订单30min后未支付自动取消的开发任务 那么今日份就来了解一下怎么用延时队列 DelayQueue搞定单机版的超时订单 二、延时队列使用场景 那么什么时候需要用延时队列呢?常见的延时任务场景 举栗子: 订单在30分钟之内未支付则自动取消。 重试机制实现,把调用失败的接口放入一个固定延时的队列,到期后再重试。 新创建的店铺,如果在十天内都没有上传过商品,则自动发送消息提醒。 用户发起退款,如果三天内没有得到处理则通知相关运营人员。 预定会议后,需要在预定的时间点前十分钟通知各个与会人员参加会议。 关闭空闲连接,服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之。 清理过期数据业务。比如缓存中的对象,超过了空闲时间,需要从缓存中移出。 多考生考试,到期全部考生必须交卷,要求时间非常准确的场景。 三、解决办法多如鸡毛 定期轮询(数据库等) JDK DelayQueue JDK Timer ScheduledExecutorService 周期性线程池 时间轮(kafka) 时间轮