第五章:SimpleTrigger
第五章:SimpleTriggerSimpleTrigger可以满足的调度需求是:在具体的时间点执行一次,或者在具体的时间点执行并且以指定的间隔重复执行若干次(其实永远重复也可以)。比如,你有一个Trigger,你可以设置它在2015年1月13日的上午11:23:54准时触发,或者在当前这个时间点触发,并且每隔2秒触发一次,一共重复5次。 根据描述,你可能已经发现了,SimpleTrigger的属性包括:开始时间、结束时间、重复次数以及重复的间隔。这些属性的含义与你所期望的是一致的,只是关于结束时间有一些地方需要注意。 重复次数,可以是0、正整数,以及常量SimpleTrigger.REPEA ...
阅读更多
第四章:关于Trigger的更多细节
第四章:关于Trigger的更多细节与Job一样,Trigger也很容易使用,但是还有一些扩展选项需要理解,以便更好地使用Qartz。Trigger也有很多类型,我们可以根据实际需要来选择。 最常用的两种Trigger会分别在第五章:SimpleTrigger和第六章:CronTrigger中讲到。 Trigger的公共属性所有类型的Trigger都有TriggerKey这个属性,表示Trigger的身份(唯一标识);除此之外,Trigger还有很多其它的公共属性。这些属性,在构建Trigger的时候可以通过TriggerBuilder设置。Trigger的公共属性有: jobKey属性:当 ...
阅读更多
第三章:Job和JobDetail的更多细节
第三章:Job和JobDetail的更多细节正如你在第二章:Quartz API、调度任务以及触发器看到的,org.quartz.Job很容易实现,在接口中只有一个execute方法。本节主要关注:Job的特点、Job接口的execute方法以及JobDetail。 你定义了一个实现Job接口的类,这个类仅仅表明该Job需要完成什么类型的任务,除此之外,Quartz还需要知道该Job实例所包含的属性;这将由JobDetail类来完成。 JobDetail实例是通过JobBuilder类创建的,导入该类下的所有静态方法,会让你编码时有DSL的感觉: import static org.quart ...
阅读更多
第一章:使用Quartz
第一章:使用Quartz内容在使用此调度器(Scheduler)之前,它需要被实例化(谁猜到这一点了? <– 这里估计是官方的调皮)。为了实例化调度器,你需要用到SchedulerFactory。一些Quartz的使用者可能会在JNDI存储中保留SchedulerFactory的实例,其他使用者可能会觉得直接初始化会更加简单(例如下面的示例)。 一旦调度器完成了实例化,就可以启动(start)、暂停(stand-by)、停止(shutdown)。注意:一旦调度器被停止,它就不能够重新启动,除非重新实例化另一个调度器实例。所有的触发器(Trigger)不会触发任务(也就是任务不会执行),除 ...
阅读更多
第二章:Quartz API、调度任务以及触发器
第二章:Quartz API、调度任务以及触发器Quartz API下面是Quartz API中的关键接口: Scheduler:与调度器交互的主要API(实际上这个就是调度器)。 Job:org.quartz.Job,希望由调度器执行的组件,是一个接口,也就是我们使用的时候被调度的任务需要实现此接口。 JobDetail:org.quartz.JobDetail,调度任务详情,用于定义调度任务。 Trigger:org.quartz.Trigger,也就是触发器,它是一个定义了给定调度任务将被执行的时间表的组件。 JobBuilder:org.quartz.JobBuilder,用于定义或 ...
阅读更多
Quartz官方文档翻译
Quartz官方文档翻译2018年5月的时候,因为要理解Quartz的相关东西,当时翻阅过它的文档顺便把它翻译了出来,已经忘记了这个事,好在存档还在硬盘上。其中有部分章节为了节省时间使用了机翻然后人工润色,目前阅读起来应该没有障碍。 这段时间太忙(996,快ICU了),先对基础教程部分重新排版和二次润色,剩下的其他文档有空再补一下。 术语: Scheduler:调度器。 SchedulerFactory:调度器工厂。 Trigger:触发器。 Job:(调度)任务或者作业,在Quartz中体现为JobDetail。 在后面的翻译中,因为个人习惯,可能会中英互用,映射关系为: Schedu ...
阅读更多
谈谈对分布式事务的一点理解和解决方案
谈谈对分布式事务的一点理解和解决方案前提最近,工作中要为现在的老系统做拆分和升级,刚好遇到了分布式事务、幂等控制、异步消息乱序和补偿方案等问题,刚好基于实践结合个人的看法记录一下一些方案和思路。 分布式事务首先,做系统拆分的时候几乎都会遇到分布式事务的问题,一个仿真的案例如下: 项目初期,由于用户体量不大,订单模块和钱包模块共库共应用(大war包时代),模块调用可以简化为本地事务操作,这样做只要不是程序本身的BUG,基本可以避免数据不一致。后面因为用户体量越发增大,基于容错、性能、功能共享等考虑,把原来的应用拆分为订单微服务和钱包微服务,两个服务之间通过非本地事务操(这里可以是HTTP或者消 ...
阅读更多
zuul源码分析-探究原生zuul的工作原理
zuul源码分析-探究原生zuul的工作原理前提最近在项目中使用了SpringCloud,基于Zuul搭建了一个提供加解密、鉴权等功能的网关服务。鉴于之前没怎么使用过Zuul,于是顺便仔细阅读了它的源码。实际上,Zuul原来提供的功能是很单一的:通过一个统一的Servlet入口(ZuulServlet,或者Filter入口,使用ZuulServletFilter)拦截所有的请求,然后通过内建的com.netflix.zuul.IZuulFilter链对请求做拦截和过滤处理。ZuulFilter和javax.servlet.Filter的原理相似,但是它们本质并不相同。javax.servlet ...
阅读更多
ThreadLocal源码分析-黄金分割数的使用
ThreadLocal源码分析-黄金分割数的使用前提最近接触到的一个项目要兼容新老系统,最终采用了ThreadLocal(实际上用的是InheritableThreadLocal)用于在子线程获取父线程中共享的变量。问题是解决了,但是后来发现对ThreadLocal的理解不够深入,于是顺便把它的源码阅读理解了一遍。在谈到ThreadLocal之前先买个关子,先谈谈黄金分割数。本文在阅读ThreadLocal源码的时候是使用JDK8(1.8.0_181)。 黄金分割数与斐波那契数列首先复习一下斐波那契数列,下面的推导过程来自某搜索引擎的wiki: 斐波那契数列:1, 1, 2, 3, 5, 8 ...
阅读更多
JDK安全模块JCE核心Cipher使用详解
JDK安全模块JCE核心Cipher使用详解前提javax.crypto.Cipher,翻译为密码,其实叫做密码器更加合适。Cipher是JCA(Java Cryptographic Extension,Java加密扩展)的核心,提供基于多种加解密算法的加解密功能。在不了解Cipher之前,我们在完成一些需要加解密的模块的时候总是需要到处拷贝代码,甚至有些错误的用法也被无数次拷贝,踩坑之后又要拷贝补坑的代码。为什么不尝试理解Cipher然后合理地使用呢? Cipher初始化transformation(转换模式)的一些知识补充转换模式transformation一般由三个部分组成,格式是:算法 ...
阅读更多