自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

卷福。的博客

还没走到最后,请别低着头

  • 博客(48)
  • 资源 (1)
  • 收藏
  • 关注

原创 Spring升级后切面注解代理失效

新版本jackson对空串的兼容1.背景2.探究3.解决1.背景把spring从4.0升级到4.3.29后,自定义一个注解,至于方法上,切面中定义的规则是注解代理,升级后工程运行不走代理方法而是走注解下的方法。2.探究Spring开启注解的配置是通过AnnotationConfigWebApplicationContext,向该context中添加一个configuration,该configuration需要有@EnableAspectJAutoProxy注解,并且如果不用@ComponentSc

2021-04-28 10:53:51 443

原创 Quartz 任务延迟执行了为什么不算misfire

misfire阈值1.背景2.misfire阈值2.1misfireThreshold2.2作为nextFireTime的下界生效2.3作为nextFireTime的上界生效3.总结1.背景在使用quartz时有时候会发现任务并不是准时执行的,而是有一些延迟,但是为什么不算是misfire呢2.misfire阈值在Quartz执行逻辑(六)misfire的处理中说了Misfire的处理是由JobStoreSupport中的一个线程MisfireHandler来处理的,此外在JobStoreSuppo

2021-04-27 17:32:51 729

原创 mysql数据库建表失败

mysql数据库建表失败一开始COLUMN_TRIGGER字段的值为trigger,用hibernate建表,数据库中一直没有表,于是对hibernate进行配置。打印出执行的sql语句,找到了create语句后用MySQL的command line执行,有以下报错:经过搜索了解到trigger是MySQL的保留关键字,不能作为列名,于是把COLUMN_TRIGGER的值改为taskTrigger解决问题。...

2021-04-27 16:36:42 754

原创 JIRA 获取任务信息

获取jira任务的信息1.背景2.探究3.解决4.总结1.背景最近做一个demo项目,需要能够显示jira任务的状态信息,所以就稍微探究了一下jira的api和一些发请求的方法。2.探究一开始发现jira提供的jira-client-api中有jiraclient类,通过它很容易就可以获取到对应的任务的信息,但是如果依赖jar,存在一个问题,就是该jar中依赖到的jar都必须要依赖,所以只引入一个client-api.jar是远远不够的,运行时会报错,之后就根据报错去maven仓库搜,再这样操作引入

2021-04-27 16:16:45 1289 2

原创 Linux java项目中的变量类型的转换问题

项目部署到服务器上类型转换的问题1.背景2.探究3.解决1.背景之前做的demo项目做第二期功能开发,在本地测过之后部署到服务器上运行又出问题了。报错为can’t cast什么什么,类型无法转换,看了一下代码是一个String类型的无法转换为int型的。2.探究该String类型的字段中的值都是数字,在windows本地运行没有任何问题,于是我把给int字段赋值的语句中加上了Integer.valueOf然后再部署到服务器上还是失败了,同样的报错。3.解决最后把String类型的字段改为Obje

2021-04-27 15:51:42 173

原创 如何在项目中使用java -cp命令并且成功部署服务器

项目中使用java -cp命令并且成功部署服务器1.背景2.探索过程3.解决1.背景最近写了一个demo项目,其中需要去创建一个新线程去执行一个带有main方法的java类,一开始是这样实现的:这样我们就拿到了新进程的对象,可以去控制其生命周期。在本地window环境运行没有问题,后来把项目部署到服务器上,在执行这部分代码的时候报错ClusterNode class not found。让人猝不及防,但是没办法,有要求必须要部署上去,那就得改啊。2.探索过程首先是了解了一下java -cp命令的

2021-04-27 15:22:52 749

原创 浅析jackson反序列化的白名单机制

初探Jackson白名单机制1.PolymorphicTypeValidator1.1简介1.2 方法1.3使用2.白名单的基本实现1.PolymorphicTypeValidator1.1简介一个关键的类:PolymorphicTypeValidator。该抽象类提供了一些方法用于判断基类及其子类的有效性来决定是否允许Jackson反序列化,所有的这些方法的实现都必须是线程安全的以及可共享的,并且结果缓存在每一个属性上,通常是root级别的,而不是validator级别的。同时缓存也要保证线程安全,

2021-04-27 14:22:15 3157 1

原创 Jackson反序列化的黑名单机制

Jackson黑名单机制1.背景2.黑名单的利用1.背景某些类在反序列化的时候可能是不安全的,会被攻击者利用其漏洞进行攻击,所以jackson采用了黑名单机制,显示声明了哪些类是不能进行反序列化的。2.黑名单的利用jackson把那些有安全问题的类都显示的添加到了SubTypeValidator的一个set字段中,该set中的类都被禁止使用,不能被反序列化。如果有需求需要禁止那些类不能使用,则可以向该set中添加其完整的包名或者类名。...

2021-04-27 14:14:48 478

原创 Quartz Cron类型触发器的misfire策略

Quartz Cron类型触发器的misfire策略1.背景2.cron类型触发器的misfire策略及处理方式2.1 IgnoreMisfire2.2 DoNothing2.3 FireNow1.背景关于misfire策略的设置在Simple类型触发器的misfire策略中已经说明了触发器的misfire策略应该如何设置,本篇介绍一下cron类型的触发器的misfire策略的种类及其处理方式2.cron类型触发器的misfire策略及处理方式2.1 IgnoreMisfire该方法设置misf

2021-04-27 13:49:17 896

原创 Quartz Simple类型触发器的misfire策略

Simple类型触发器的misfire策略1.背景2.misfire策略的设置及处理方式2.1IgnoreMisfire2.2 FireNow2.3NextWithExistingCount2.4NextWithRemainingCount2.5 NowWithExistingCount2.6 NowWithRemainingCount3.总结1.背景在Quartz执行逻辑(六)misfire的处理中介绍了quartz关于misfire处理的逻辑。在该篇中我们提到了关于misfire的处理策略是可以设置

2021-04-27 11:55:09 1189

原创 初探RFD-RFD的攻击原理和应对措施

RFD全称Reflection file download,反射文件下载,一种json攻击手段。通过在URL中插入带有可执行文件的内容,一旦被点击这些可执行文件就会被下载并执行,攻击者通过控制文件的内容来达到自身攻击的目的。通过这个文件攻击者可以控制用户的计算机,可以控制浏览器设置包括那些加密的会话,还可以利用已下载的软件的漏洞。攻击者通常使用一些热门的受信任的域名来掩饰这个URL,让用户任务这是个安全的连接可以点击,以此让用户认为所有的操作都是安全的,从而使得攻击能够顺利进行。RFD攻击想要能够进行有

2021-04-22 14:52:48 2044 1

原创 Quartz 暂停后恢复任务,任务如何不会被misfire处理

暂停后恢复任务如何忽略misfire1.背景2.处理方法1.背景任务如果在暂停期间有本该触发的情况,但是由于被暂停了没有触发,那么在任务恢复的时候就会被检测到它misfire了。此时MisfireHandler线程就会根据添加任务时的misfire策略去处理它。但是如果想要忽略这种misfire的情况该怎么做呢,人为的暂停不算是misfire,遇到宕机,断电这种情况才算。2.处理方法在Quartz执行逻辑(七)任务的暂停和恢复中说到了,在resumeTrigger方法中如果nextFireTime小

2021-04-21 14:27:10 870

原创 Quartz执行逻辑(七)任务的暂停和恢复

Quartz执行逻辑(七)任务的暂停和恢复1.简介2.暂停与恢复任务2.1暂停任务2.2恢复任务1.简介前面在Quartz执行逻辑(一)中说到trigger的状态是WAITING的,会在目标时间被触发,所以暂停与恢复任务自然是修改了trigger的状态。2.暂停与恢复任务2.1暂停任务暂停任务时通过调用Scheduler的pauseJob方法来实现这个操作。这个方法一直向下调用到了JobStoreSupport中的pauseJob方法。该方法中是对任务的trigger进行操作的,也证实了前面的猜想

2021-04-21 10:45:42 7116

原创 Quartz执行逻辑(六)Misfire的处理

Quartz执行逻辑(六)Misfire的处理背景Quartz的misfire机制背景Quartz框架在执行任务中可能会由于停电,宕机等原因,有一段没有去调度任务,但是有些任务可能刚好应该在这个时间内执行,此时就会出现在本该执行的时间没有执行的情况。这种情况就叫做misfire了。Quartz的misfire机制为了解决这个问题,Quartz框架也是做出了应对,它提供了多种可选的misfire处理策略,在添加任务时就可以配置,之后在任务misfire时就会根据配置的策略去处理。Quartz在Job

2021-04-19 18:34:59 2303

原创 Quartz执行逻辑(五)misfire情况下虽然job class not found但是任务仍然一直执行

1.介绍前面在Quartz执行逻辑(四)中说到任务在执行时如果获取job信息时抛了class not found的异常则Quartz会把trigger的状态置为ERROR,而状态为ERROR的trigger是不会被触发的。所以可以给这个异常加日志打印帮助排查信息,但是在misfire的时候,虽然这个class not found的日志打印了,但是任务好像还是可以执行,没有状态被置为ERROR的迹象。2.misfire处理过程中job class not found所谓misfire就是一个tr.

2021-04-14 15:04:46 723

原创 Quartz执行逻辑(四)触发器状态变成error,任务不执行

1.介绍

2021-04-14 11:21:52 5498 6

原创 Quartz执行逻辑(三)QRTZ_FIRED_TRIGGERS表的作用

1.介绍在Quartz执行逻辑(一)中介绍到的操作基本都是对QRTZ_TRIGGERS表进行的,该表存的是job对应的触发器的记录。本篇介绍一下QRTZ_FIRED_TRIGGERS表在Quartz执行中的作用。2.向QRTZ_FIRED_TRIGGERS表的时机在Quartz执行逻辑(一)中说到了,Quartz框架有一个单独的线程去扫描QRTZ_TRIGGERS表,去获取那些将要到nextFireTime的triggers的记录。在获取到之后,要把这些记录中的部分信息插入到QRTZ_FIRED

2021-04-13 19:53:50 11288 3

原创 Quartz执行逻辑(二)触发器状态的变更

1.获取trigger执行时首先要获取到那些将要触发的触发器,会有一个调度线程去查找QRTZ_TRIGGERS表中状态为WAITING的trigger。获取到的trigger的状态会被置为acquired。2.触发trigger获取到的将要触发的trigger的nextFireTime和当前时间十分接近时,quartz此时会去把acquired改变为executing。如果不允许job并发执行的,此时还会把当前QRTZ_TRIGGERS表中状态为WAITING,ACQUIRED,PAUSED的改

2021-04-12 15:13:30 4132

原创 Quartz执行逻辑(一)QuartzSchedulerThread介绍,quartz执行流程简介

1.背景入职以来负责定时调度相关的业务,其底层用的是quartz框架。趁着最近有时间来总结一下quartz的相关逻辑。本篇就先简述一下quartz的执行逻辑。2.执行逻辑叙述quartz是通过一个调度线程不断的扫描数据库中的数据来获取到那些已经到点要触发的任务,然后调度执行它的。这个线程就是QuartzSchedulerThread类。其run方法中就是quartz的调度逻辑。2.1获取触发器(Triggers)run方法中首先会判断quartz框架的线程池是否有可用的线程且没有被暂停,

2021-04-12 11:46:09 5617 1

原创 Gradle下不使用jacoco插件,自定义实现单测分支覆盖率等控制

1.背景项目中没有使用jacoco插件而是使用了jacoco插件依赖的两个jar包,并且规定给jacoco使用。所以不能直接使用jacocoTestCoverageVerification来直接配置规则。2.探索观察codeCoverageReport任务中的配置,猜测应该是按照字段属性的名称来配置。反编译jar包中对应的task的class文件发现与规则相关的字段属性叫check,但是直接配置check会配置成gradle的check任务,即检查代码编写质量。再对html进行大小写实验后发现改

2021-04-09 17:43:18 284

原创 自定义doclet实现控制使用了特定注解的类才生成JavaDoc,且支持区分类和方法以及注解的维度

1.gradle乱码问题在gradle中定义了一个自定义的task,该task用于生成JavaDoctask generatePublicAPIDocs(type: JavaDoc){ List<File> list = new ArrayList() list.add(file("src/main/java/com/fr/doclet")) options.setDocletPath(list) options...

2021-04-09 17:06:25 505

原创 Java Stream 简介

Stream作为java8的新特性,基于lambda表达式,是对集合对象功能的增强,它专注于对集合对象进行各种高效、便利的聚合操作或者大批量的数据操作,提高了编程效率和代码可读性。Stream的原理:将要处理的元素看做一种流,流在管道中传输,并且可以在管道的节点上处理,包括过滤筛选、去重、排序、聚合等。元素流在管道中经过中间操作的处理,最后由最终操作得到前面处理的结果。首先创建一个实体类:...

2019-09-03 17:00:10 384

原创 Redis Sentinel简介

架构: Redis Sentinel 监控Redis节点,能够实现故障转移,通知客户端,实现高可用。可以同时监控多套主从复制结构,使用master-name来标识。Redis Sentinel实现故障转移的基本流程:1.多个sentinel节点发现并且确认master节点有问题2.选举出一个sentinel节点作为领导,因为故障转移的过程只需要一个sentinel节...

2019-08-27 12:33:21 228

原创 Redis两种持久化方式——RDB和AOF

Redis的持久化简单来说就是异步的把内存中的数据保存到硬盘上,Redis提供了两种持久化的方式分别是RDB和AOF。 RDB RDB是一种使用快照方式的持久化,它会把当前的数据像拍照一样照下来,生成RDB文件保存到硬盘,是一个整个的形式,而AOF是一种日志式的持久化,每一条更新都会写入AOF。生成的RDB文件在Redis启动时可以载入,恢复数据,并且该R...

2019-08-24 14:59:43 347

原创 Jedis zrangWithScores结果直接打印是ASCII码的值的问题

在使用jedis的zrangeWithScores获得redis的zset时,如果直接打印出来其中的element是一个byte数组,并且打印出来的是ASCII码的值:看了一下该方法的返回值是一个Set,所以就逐个打印出Set的中的元素,发现还是一个member的值还是一个数组:仔细看了该方法的返回值发现泛型是Tuple的,所以点进去看了一下,发现该类由一个私有成...

2019-08-17 15:53:34 1752

原创 Redis的特点和常用的命令

Redis的特性速度快:内存数据库,C语言编写,单线程持久化:对数据的更新异步保存到磁盘上有RDB和AOF两种方式多种数据结构:string,hash,list, set,sorted set,衍生的数据结构有:hyperloglog,GEO功能丰富:发布订阅,Lua脚本,事务,pipeline简单:代码少,不依赖外部库,单线程模型主从复制:给高可用提供了保障高可用:R...

2019-08-13 20:33:29 81

原创 Redis的五种数据结构及其常用API

string 结构: key-value,key是字符串,value可以存字符串,数字(底层会有一个转换),二进制数据,序列化的对象,比如JSON对象,其本质上都是二进制的数据。常用API: incr key #key自增1,如果key不存在,自增后get(key)返回1,时间复杂度:O(1) decr key #key自减1,如果...

2019-08-13 19:52:48 276

原创 Volatile禁止程序指令重排序

内存可见性Java内存模型规定,对于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立的工作内存,并且线程只能访问自己的工作内存,不可以访问其它线程的工作内存。工作内存中保存了主内存中共享变量的副本,线程要操作这些共享变量,只能通过操作工作内存中的副本来实现,操作完毕之后再同步回到主内存当中,其JVM内存模型大致如下图。而JAVA内存模型规定工作内存与主内存之间的交互协议,其中包括...

2019-08-05 14:32:34 122

原创 Happens-Before规则和内存屏障指令

首先了解一下什么是JMM,JMM是Java内存模型,它规定和指引Java程序在不同的内存架构,CPU和操作系统间有确定性行为。它在多线程的情况下尤其重要。Java内存模型对一个线程所作的变动能被其他可见提供了保证,它们之间是先行发生关系。 JSR-133内存模型规范使用Happens-before的概念来阐述操作之间的内存可见性。在JVM中如果一个操作执行的结果...

2019-08-05 11:14:54 806

原创 Spring循环依赖的三种模式

构造器参数依赖 Spring容器会将正在创建的Bean的标识符放在一个“当前创建Bean”的池中,在Bean的创建过程中,该标识符一直存在于池中,如果此时再次创建该Bean就会抛出异常,Bean创建完成后该标识符会从池中清除。Bean的定义:Bean的声明:测试:报错提示bean1中无法给构造器参数注入bean2,其他bean也是相同的错误,...

2019-08-01 19:02:25 379

原创 基本排序算法

冒泡排序 冒泡排序顾名思义就是让数按顺序一个一个冒出来,得到的序列就是排好序的结果。从前向后遍历的话每次都能够让最大的冒出来。算法使用双层循环,外层控制要遍历的次数,内层控制本次遍历的长度,此外可以加一个交换标志判断是否完成排序,不一定要完成所有趟遍历才能得出结果,一趟遍历中没有数据的交换即说明已经完成排序:平均时间复杂度O(n2),数据有序时不用交换,只要遍历一趟时间复杂度O(n...

2019-07-31 18:31:14 99

原创 Spring Bean的生命周期

首先看一下大致的生命流程图:首先是Bean的实例化 初始化之后是注入Bean定义的属性 检测Bean是否实现了BeanNameAware接口,调用setBeanName方法传递Bean的ID 检测Bean是否实现了BeanFactoryAware接口,调用setBeanFactory方法传递factory 检测Bean是否实现了ApplicationContextAware接口,调...

2019-07-30 18:53:17 95

原创 SpringAOP叠加使用时的职责链模式

传统的责任链模式的UML图: 从图中可以看出有组合关系,即每个Handler中组合有下一个要执行的Handler,有代码耦合,而且在使用的时候,必须设置好执行链,也就是给每一个Handler设置好后继的Handler。如图: Client中的代码显示十分冗余重复,所以Spring中对责任链模式进行了优化,把重复冗余的部分封装起来,封装成一个执行链,避...

2019-07-29 18:12:05 270 1

原创 SpringAOP的两种代理及其实现

静态代理 传统的代理模式,其UML图: 采用这种方法,在Subject接口中有多少方法,Proxy中就要有多少方法,而这些方法中只是调用了RealSubject中的方法,可以说是很没有必要,显得冗余。所以在SpringAOP中使用的是动态代理,而动态代理又分为两类,1.jdk代理,2.Cglib代理。 动态代理 1.jdk代理(只能基于接口):接口:...

2019-07-26 18:50:21 369

原创 SpringAOP表达式及五种Advice

SpringAOP表达式SpringAOP表达式由三部分组成:指示器(Designators) 通配符(WildCards) 运算符(Operators) 指示器: 匹配方法:execution() 匹配注解:@target,@args,@within,@annotation 匹配包/类型:within() 匹配对象:this(),bean(),target() 匹配参...

2019-07-25 12:00:49 753

原创 设计模式——单例模式及其常见的实现方式

单例模式简单来说就是确保一个类只有一个对象,并且这个对象由自身实例化向整个系统提供。 使用单例模式的好处是能够节省对象在创建或销毁时消耗的资源,比如数据库的连接,在打开连接或关闭连接时都会消耗较多的资源,使用单例模式就能够避免不必要的资源消耗。下面说一下单例模式的几种使用:懒汉模式:懒汉模式顾名思义就是比较懒,别人不需要这个单例的对象的时候类本身就不去实...

2019-07-24 19:12:54 74

原创 Java类的加载以及初始化顺序

首先是都知道的父子类的初始化顺序:父类静态属性>父类静态代码块>子类静态属性>子类静态代码块>父类非静态属性>父类非静态代码块>父类构造方法>子类非静态属性>子类非静态代码块>子类构造方法。单个类的情况但是如果在testClass中加上static testClass field = new testClass();...

2019-07-23 19:54:04 263

原创 Spring Bean的注入方式(注解方式)

构造器注入:AnotherBean类上需要有Component注解表明交给Spring管理,可以由Spring来创建一个Bean。setter注入:单个注入 2.集合注入 2.1List注入:第二个Bean注入优先级高,若想注入第一个Bean,可以在@Bean后声明name,在注入的地方使用@Qualifier表明要注入的Bean的name。...

2019-07-19 18:44:30 1309

原创 Spring Bean的作用域

Singleton单例模式,在spring的一个上下文环境的生命周期中只存在一个实例spring.xml:测试:多个spring上下文环境:prototype多例模式,每次向spring的上下文请求Bean时都会得到一个新的Bean:spring.xml:测试结果:组合使用:bean singleton,bean1 singl...

2019-07-19 09:36:49 162 1

原创 Spring Bean的创建与注入方式(非注解方式)

Bean的创建1.通过构造器创建:spring.xml:测试:2.通过静态工厂方法创建:spring.xml:测试:3.通过实例工厂方法创建:spring.xml:测试:测试方法的运行结果:并且把Bean2和Bean3在测试中的相关创建语句都注释掉,它们的构造方法也还是会执行,所以spring.xml文...

2019-07-18 19:46:58 1029

自定义doclet控制生成JavaDoc

针对于有需要控制JavaDoc生成内容的需求。对于使用了自定义注解的类才生成JavaDoc。且支持类和方法两个粒度。在类上使用就生成整个类的,在方法上生成就生成单个方法的。配合gradle task使用,具体代码可见本人博客。

2021-04-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除