quartz

Spring 定时器quartz,动态添加定时任务

南楼画角 提交于 2020-08-05 00:50:33
QuartzUtils: import com.demo.bean.QuartzBean; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; /** * 创建定时任务暂停,修改,启动,单次启动工具类 */ public class QuartzUtils { private static SchedulerFactory schedulerFactory = new StdSchedulerFactory(); /** * 创建定时任务 定时任务创建之后默认启动状态 * @param quartzBean 定时任务信息类 */ @SuppressWarnings("unchecked") public static void createScheduleJob(QuartzBean quartzBean) throws ClassNotFoundException, SchedulerException { Scheduler scheduler = schedulerFactory.getScheduler(); //获取到定时任务的执行类 必须是类的绝对路径名称 //定时任务类需要是job类的具体实现 QuartzJobBean是job的抽象类。 Class<? extends Job>

房价网是怎么使用分布式作业框架elastic-job

泄露秘密 提交于 2020-08-04 14:15:54
长按二维码,关注我们 老文章,由于之前手误被删除了,重新发出来 Elastic-Job是什么? Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。 Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务;Elastic-Job-Cloud采用自研Mesos Framework的解决方案,额外提供资源治理、应用分发以及进程隔离等功能。 官网地址: http://elasticjob.io/ Github: https://github.com/elasticjob/elastic-job 为什么要使用Elastic-Job 目前我们公司用的是基于Linux Crontab的定时任务执行器。 存在如下问题: 无法集中管理任务 不能水平扩展 无可视化界面操作 存在单点故障 除了Linux Crontab在java这块的方案还有 Quartz,但 Quartz缺少分布式并行调度的功能。 存在的问题也很明显: 当我的项目是一个单体应用时,在里面基于Quartz起一个定时任务,可以很愉快的运行 当我的项目做了负载,扩充到3台节点时,3个节点上的任务会同时执行,数据乱了 同时执行要保证数据没问题需要引入分布式锁来调度,难度增大 怎么解决? 1.自研框架

为什么Quartz Task在Tomcat中跑了两次?

Deadly 提交于 2020-07-28 20:38:01
问题描述 Spring Quartz 是很常用的定时任务框架。把一个 Quartz 的工程部署到 Tomcat 中启动,意外地发现,每个 Task 都在同一时间跑了两次,而本地在开发的过程中却没有问题。 问题排查 为了防止多线程问题,有部分 Task 上是加了锁的,类似如下方式: [@Component](https://my.oschina.net/u/3907912) public class ExampleTask{ private ReentrantLock lock = new ReentrantLock(); protected void executeInternal(){ if (lock.tryLock()) { try { // task main logic } finally { lock.unlock(); } } } } 按理说, Spring 中 Bean 默认是单例的,加了锁之后,同一时间,只会有一个线程能拿到锁,然后执行 Task 的逻辑才对。难道锁不生效?于是我们又新增了类似如下日志,把 ReentrantLock 对象和 this 都打印出来: logger.info("lock: " + lock + ", this: " + this); 得到: 2020-05-12 06:26:40 INFO ExampleTask:30 -

spring boot activiti vue工作流,权限管理框架

…衆ロ難τιáo~ 提交于 2020-07-28 18:06:44
是什么? 使用springboot,activiti,mybatis,vue elementui开发的后台管理系统(包含权限管理、工作流等功能),真正前后端分离的微服务架构,经过很多项目实战、淬炼、软件开发公司主流技术的集大成者。 功能点、技术点 前端采用vue element ui框架,后端spring boot,mybatis开发框架,数据库:mysql,前后端分离。 采用activiti工作流工作流框架, 自定义流程设计 流程提供发起、跳转、转办、委派、授权、任务处理,人员角色获取、角色类型获取、 会签 等功能。 采用安全框架 Spring Security (登录授权)实现组织机构、角色,人员、功能权限、 数据权限 功能。 提供 页面扩展 功能, 拖拽及可以扩展页面功能 后端多模块项目(基础设施子项目、基础功能子项目、业务功能子项目),结构清晰、各子项目独立扩展、升级。 后端系统组件化,提供 分页 、 树形 、 通用查询 数据结构,封装系统复杂度,只需要写出简单的业务代码,即能完成一个复杂的功能。 前端项目多模块(基础组件、通用框架、基础功能,业务功能),结构清晰,子项目独立。 前后端完美结合,很简单的代码即可以实现分页列表、树形等复杂页面。 前端提供数字输入、货币输入( 输入时自动中文货币提示 )、百分比输入、整数输入、 字典下拉 、日期快捷输入、日期范围输入表单控件。

QuartzSchedulerThread 调度分析

寵の児 提交于 2020-07-28 05:21:40
1 Quartz 线程 Quartz 有两类线程,调度线程(红) 和 执行线程(绿),如图: 2 QuartzSchedulerThread 分析 QuartzSchedulerThread 为Quartz核心线程,负责任务的调度,读取用户设定的触发器并分配线程,使触发器能够按照预定时间执行。 2.1 执行步骤说明 循环判断调度是否应该停止,如果应该停止则清空资源结束调度 循环判断调度是否应该暂停,如果应该暂停则,则调用wait阻塞本线程,直到被外部唤醒 (被唤醒后)从线程池中查询可用的任务执行线程,若线程池中暂无可用线程,则阻塞本线程,直到获取至少一个可用线程 根据一定规则从任务存储区域(JobStore)中找出马上要执行的一批触发器 配置参数 idleWaitTime,默认为30000,即在当前时间后 30s 内即将被触发执行的触发器就会被取出 配置参数 misfireThreshold,默认为60000,即在当前时间的 60s 之前本应执行但尚未执行的触发器不被认为是延迟触发,也会取出。更早之前的由 MisfireHandlerThread 按 Misfire 策略处理。 配置参数 batchTriggerAcquisitionMaxCount,默认为1,即一次拉取的批次数量为【 Math.min(该值, 可用线程数) = 1】 当该值大于1时,在集群环境下,需确保

[外包]!采用asp.net core 快速构建小型创业公司后台管理系统(四.quartz 简单配置使用)

跟風遠走 提交于 2020-07-23 23:37:13
上一章介绍了log4net的简单配置,这一章介绍一下quartz的简单使用,下一章介绍一下我得权限使用,然后就结束 本章主要介绍: quartz在asp.net core中的使用 这个项目虽小,但是及其容易扩展,后面的业务直接能丢进来,使其更加丰富 废话不说开始介绍 一.基础类配置   在domain里定义IJobCenter接口      代码如下:    public interface IJobCenter { /// <summary> /// 添加定时任务 /// </summary> /// <param name="m"></param> /// <returns></returns> Task<Result> AddScheduleJobAsync(TaskScheduleModel m); /// <summary> /// 暂停定时任务 /// </summary> /// <param name="jobGroup"></param> /// <param name="jobName"></param> /// <returns></returns> Task<Result> StopScheduleJobAsync( string jobGroup, string jobName); /// <summary> /// 恢复定时任务 /// <

spring定时器------QuartzJobBean

和自甴很熟 提交于 2020-05-09 20:43:00
quartz 任务类 QuartzJobBean.java /* * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and *

一口气说出 6种 延时队列的实现方法,面试官也得服

…衆ロ難τιáo~ 提交于 2020-05-09 08:45:27
五一期间原计划是写两篇文章,看一本技术类书籍,结果这五天由于自律性过于差,禁不住各种诱惑,我连电脑都没打开过,计划完美宣告失败。所以在这能看出和大佬之间的差距,人家没白没夜的更文,比你优秀的人比你更努力,难以望其项背,真是让我自愧不如。 知耻而后勇,这不逼着自己又学起来了,个人比较喜欢一些实践类的东西,既学习到知识又能让技术落地,能搞出个 demo 最好,本来不知道该分享什么主题,好在最近项目紧急招人中,而我有幸做了回面试官,就给大家整理分享一道面试题:“ 如何实现延时队列? ”。 下边会介绍多种实现延时队列的思路,文末提供有几种实现方式的 github 地址。其实哪种方式都没有绝对的好与坏,只是看把它用在什么业务场景中,技术这东西没有最好的只有最合适的。 一、延时队列的应用 什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。 延时队列在项目中的应用还是比较多的,尤其像电商类平台: 1、订单成功后,在30分钟内没有支付,自动取消订单 2、外卖平台发送订餐通知,下单成功后60s给用户推送短信。 3、如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存 4、淘宝新建商户一个月内还没上传商品信息,将冻结商铺等 。。。。 上边的这些场景都可以应用延时队列解决。 二、延时队列的实现

一口气说出 6种 延时队列的实现方法,面试官也得服

有些话、适合烂在心里 提交于 2020-05-08 14:05:34
五一期间原计划是写两篇文章,看一本技术类书籍,结果这五天由于自律性过于差,禁不住各种诱惑,我连电脑都没打开过,计划完美宣告失败。所以在这能看出和大佬之间的差距,人家没白没夜的更文,比你优秀的人比你更努力,难以望其项背,真是让我自愧不如。 知耻而后勇,这不逼着自己又学起来了,个人比较喜欢一些实践类的东西,既学习到知识又能让技术落地,能搞出个 demo 最好,本来不知道该分享什么主题,好在最近项目紧急招人中,而我有幸做了回面试官,就给大家整理分享一道面试题:“ 如何实现延时队列? ”。 下边会介绍多种实现延时队列的思路,文末提供有几种实现方式的 github 地址。其实哪种方式都没有绝对的好与坏,只是看把它用在什么业务场景中,技术这东西没有最好的只有最合适的。 一、延时队列的应用 什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。 延时队列在项目中的应用还是比较多的,尤其像电商类平台: 1、订单成功后,在30分钟内没有支付,自动取消订单 2、外卖平台发送订餐通知,下单成功后60s给用户推送短信。 3、如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存 4、淘宝新建商户一个月内还没上传商品信息,将冻结商铺等 。。。。 上边的这些场景都可以应用延时队列解决。 二、延时队列的实现

面试官:来,手写一个线程安全并且可以设置过期时间的LRU缓存

耗尽温柔 提交于 2020-05-06 23:08:12
划重点,手写一个 LRU 缓存在面试中还是挺常见的! 很多人就会问了:“网上已经有这么多现成的缓存了!为什么面试官还要我们自己实现一个呢?”。 咳咳咳,当然是为了面试需要。哈哈!开个玩笑,我个人觉得更多地是为了学习吧! 今天教大家: 实现一个线程安全的 LRU 缓存 实现一个线程安全并且带有过期时间的 LRU 缓存 考虑到了线程安全性我们使用了 ConcurrentHashMap 、ConcurrentLinkedQueue 这两个线程安全的集合。另外,还用到 ReadWriteLock(读写锁)。 为了实现带有过期时间的缓存,我们用到了 ScheduledExecutorService来做定时任务执行。 如果有任何不对或者需要完善的地方,请帮忙指出! 1. LRU 缓存介绍 LRU (Least Recently Used,最近最少使用)是一种缓存淘汰策略。 LRU缓存指的是当缓存大小已达到最大分配容量的时候,如果再要去缓存新的对象数据的话,就需要将缓存中最近访问最少的对象删除掉以便给新来的数据腾出空间。 2. ConcurrentLinkedQueue简单介绍 ConcurrentLinkedQueue是一个基于单向链表的无界无锁线程安全的队列,适合在高并发环境下使用,效率比较高。 我们在使用的时候,可以就把它理解为我们经常接触的数据结构——队列