
java
文章平均质量分 73
#朱守成#
热爱技术, 为人随和,易相处
展开
-
Spring Boot集成RocketMQ之消息对象序列化
当我们在Spring Boot项目中集成RocketMQ后,只需要在配置文件(application.yml)中添加rocketmq的相关配置,即可使用rocketMQTemplate发送对象消息。登录RocketMq Dashborad查看消息会发现我们的对象消息被序列化成json串。那它是使用哪种json序列化工具的呢?Spring Boot在装配RocketMQTemplate时为我们提供了四种消息对象转换类,当发送消息时依次有序的使用四种消息转换类对消息进行序列化,直到找到一个合适的消息转换类。原创 2023-12-21 13:55:47 · 3058 阅读 · 0 评论 -
使用ItextPdf给PDF文件加文字水印和图片水印
一. pom添加itextpdf依赖<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.12</version></dependency><!-- 中文水印的字体支持 --><dependency> <group原创 2022-02-17 14:09:45 · 3261 阅读 · 5 评论 -
spring 实现异步非阻塞长轮询
一. 前言今天接到一个扫码登录的需求。想一想很简单,服务端提供一个获取二维码接口,在提供一个查询扫码状态的接口,客户端不停轮询"查询扫码状态接口"判断用户是否已扫码登录,并很快实现。本想开发完成后又可以愉快的摸鱼了,但仔细想想又觉得差点意思。客户端如何频繁的去轮询服务端接口势必会大量浪费tomcat的线程,造成服务端的压力。其实大部分的轮询请求都是无意义的,那是否可以考虑服务端将轮询请求挂起,释放tomcat线程,当有结果时在将响应返回给客户端?于是通过查阅文档发现Spring已经提供了实现方法Call原创 2021-11-23 10:21:08 · 1568 阅读 · 2 评论 -
Security Oauth2 增加新的认证方式
一. 前言公司统一认证使用Security Oauth2框架搭建,最近接到一个需求,需要增加一种短信验证码的认证方式。Security Oauth2默认只支持四种认证方式,并不支持短信验证码的验证方式,故需要扩展一种新的认证方式。扩展的前提是需要对框架本身有一定的认识,所以花时间学习了一下Security Oauth2的认证原理。二. 四种默认认证方式授权码模式授权码模式(authorization code)是功能最完整、流程最严密的授权模式,code保证了token的安全性,即使code被原创 2021-11-20 16:14:19 · 1065 阅读 · 0 评论 -
巧用mysql位运算解决多选值存储问题
一.问题场景工作中经常遇到多选值存储问题,例如:用户有多种认证方式,密码认证、短信认证、扫码认证等,一个用户可能只开启了其中某几种认证方式。二. 场景分析比较容易理解的两种实现方式,多字段存储、单个字段拼接存储。1.多字段存储每种认证方式用一个字段存储,0表示未开启,1表示已开启。缺点:每增加一种认证方式都需要添加一个表字段,扩展性差。2.单字段拼接单字段存储,已开启的认证方式用逗号(或其他分割符)拼接。例如:开始了密码认证和短信认证,则存储为:密码认证,短信认证。缺点:不利原创 2021-11-17 14:43:33 · 2649 阅读 · 0 评论 -
终于把Spring三级缓存彻底看明白了
一. 前言从简单到复杂应用开发中,难免会遇到spring bean循环依赖问题,即Bean A依赖Bean B, 同时Bean B依赖Bean A。Spring大神提出了三级缓存帮助我们解决循环依赖的问题。二. 概念说明singletonFactories :一级缓存,存放类工厂(ObjectFactory),实例Bean通过ObjectFactory创建。earlySingletonObjects :二级缓存,存放创建不完全的Bean实例。singletonObjects :三级缓存,存放原创 2021-10-29 18:15:18 · 3000 阅读 · 2 评论 -
实例分析堆内存与直接内存
一. 前言堆内存:jvm内存中最重要的使用最多的一块内存。直接内存:jvm以外的,机器内存。jdk1.8开始,舍弃原有的方法区,引入新的元空间。元空间存储的内容并无大的改变。元空间从jvm的内存模型中移出,使用直接内存。那为什么元空间使用直接内存?如果直接内存具有较好的优势,那为什么还要保留jvm内存?二. 实例import java.nio.ByteBuffer;public class HeapAndDirectMemoryTest { public static void原创 2021-10-25 12:34:19 · 655 阅读 · 0 评论 -
redis 缓存雪崩、穿透、击穿
一.概述Redis 是开发中经常用到的非关系型数据库,redis被使用最多的就是用来缓存数据,也可以直接当数据库使用。被用来做缓存时,有三个比较典型的问题:雪崩、穿透、击穿。二.说明雪崩:大量的key在同一时间过期,导致大量请求到达数据库。穿透:大量的不存在key在短时间内访问,导致大量请求到达数据库。击穿:热键key过期时,大量请求并发,导致大量请求到达数据库。三.解决方案1.雪崩避免key的过期时间相同,不同的key设置不同的过期时间。2.穿透方案一:访问的key如果原创 2021-10-22 14:41:00 · 242 阅读 · 0 评论 -
一文搞懂AOP调用原理
一. 前言AOP是spring框架的两大核心之一,在日常工作中也会经常会到它,典型的应用用来记录日志,包括spring的注解事务也是通过AOP实现的。大家是否都对AOP原理都很清楚呢?AOP底层到底是如何实现的?AOP在什么场景下会失效?二. AOP失效例子带着这些疑问,我们从一个AOP失效的例子开始揭开AOP的面纱。定义一个切点@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic原创 2021-10-14 16:18:58 · 465 阅读 · 0 评论 -
jenkins 安装配置实战
提前准备:安装jdk, maven, git一. 安装# wget命令从jenkins官网下载yum源sudo wget -O /etc/yum.repos.d/jenkins.repo \ https://pkg.jenkins.io/redhat-stable/jenkins.repo# 导入jenkins安装过程中需要的keysudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key# 导入jenkins安装过原创 2021-09-24 14:13:42 · 143 阅读 · 0 评论 -
滑动时间窗口实现简单接口限流
本文目的在学习阿里开源框架sentinel后,为加深对滑动时间窗口的理解,故自己实现简单接口限流。SentinelSentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。Sentinel的一切功能都是以流量统计为基础。基于滑动时间窗口实现秒级的流量统计。滑动时间窗口Sentinel以1秒为时间宽度,将1秒平均分隔成指定数量的时间窗口,任意的时间对应唯一的一个时间窗口,每个时间原创 2021-03-03 20:28:09 · 908 阅读 · 8 评论 -
Java线程池学习总结
自定义线程池ThreadPoolExecutor是jdk给我们提供的可以快速开启管理一个线程池的方法。它的构造方法中提供了多个可配置参数,开发者可根据需求自定义参数。public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeU原创 2020-11-30 15:55:30 · 174 阅读 · 0 评论 -
ThreadLocal原理学习
什么是ThreadLocalThreadLocal是一种数据类型,类似HashMap的key : value存储。主要用来存储线程独有的变量,各线程间互不干扰。通过get、set方法存入读取数据,操作简单。ThreadLocal、ThreadLocalMap、ThreadThreadLocal担任get、set、remove等操作方法。ThreadLocalMap是底层数据结构,存储数据,使用动态数组Entry[]实现,它是ThreadLocal的一个内部类。Thread维护了一个类变量Thre原创 2020-11-30 14:19:47 · 571 阅读 · 1 评论 -
JMM多线程内存模型笔记
内存模型概念解释JMM:多线程操作下的一系列规范约束,同时屏蔽了不同硬件和操作系统内存的访问差异主内存:即JVM堆内存工作内存:cpu的寄存器和高速缓存的抽象描述。缓存一致性协议:主内存与工作内存数据交互的一系列协议,read、load、assign、use、store、write、lock、unlock。lock和unlock,直接对应着synchronized关键字的monitorenter和monitorexit字节码指令。原子性:表示某个操作或某些操作是原子的,不可分隔的。可见性:变原创 2020-11-27 17:23:28 · 210 阅读 · 0 评论 -
maven archetype学习笔记
一. archetype是什么archetype是一个maven项目模板工具包。一个Archetype定义了要做的相同类型事情的初始样式或模型。这个名称给我们提供来了一个一致的生成Maven工程的方式。Archetype会帮助作者给用户创建Maven工程模板,并给用户提供生成相关工程模板版本的参数化方法。二. archetype用途管理公司项目骨架。当公司系统发展到一定规模后势必会有一些基础依赖、项目配置、项目架构规范,新建一个项目时就需要初始化很多东西,手动完成这些初始化工作费时费力还很.原创 2020-10-09 14:01:27 · 337 阅读 · 0 评论 -
Springboot源码解析之Environment
前言:springboot近些年已经逐渐成为新项目的必备框架。Springboot可以只使用几行代码就可以帮我们搭建一个可运行的项目框架。Springboot的自定义配置也是非常简单,只需要遵循规范在application.yml或application.properties中添加配置,就可以在代码中使用@Value获取到配置。那么springboot就的合适加载的自定义配置?自定义配置又是存储在哪里的呢?Springboot的启动类很简单,一行代码就搞定。@SpringBootApplicati原创 2020-08-09 16:13:55 · 499 阅读 · 0 评论 -
深入探究JDK的SPI机制
概念:SPI的全称service provider interface。是JDK内置的一种服务提供机制。一种典型的面向接口编程。JDK定义了一些接口规范,由服务提供者自定义扩展实现接口。下面以JDBC为案例一探SPI机制的具体实现原理,直接上代码:import java.sql.*;public class JdkSpiMain { public static void main(String[] args) { Connection conn = null;原创 2020-07-30 21:03:29 · 416 阅读 · 0 评论 -
基于Socket实现简单RPC框架
废话不多说,直接上代码:1. RpcServer:rpc服务端,用于启动Socket监听端口import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.HashMap;import java.util.Map;import java.util.co...原创 2018-10-16 15:14:47 · 1355 阅读 · 0 评论 -
初探spring boot Enable能力
spring boot 由于其超强的整合能力和强大的社区生态,已经渐渐成为java项目开发必备框架。 使用过springboot的同学们应该都很清楚,很多第三方组件与springboot集成时只需要添加一个@EnableXXX注解,就可以在项目中使用。下面使用springboot的Enable来实现一个记录方法调用次数的例子。 第一步. 定义Enabl...原创 2018-09-23 15:00:02 · 468 阅读 · 0 评论 -
JVM垃圾收集算法笔记
商用HotSpot虚拟机将堆内存分为年轻代和老年代。年轻代又可细分为Eden区和From survivor区和To survivor区。Eden和survivor默认使用8:1比例。 常用收集算法: 1. 标记--清除算法:分为“标记”、“清除”两个阶段。先标记所有需要回收的对象,标记完成后统一清除被标记的对象。标记、清除两个阶段的效率都不高,且会产生...原创 2018-09-24 15:20:34 · 204 阅读 · 0 评论 -
面试笔记
今天去某D轮互联网公司面试,被面试官问到一个和算法有关的问题:从一亿长度的整形数组中取出最大的六个数。当时第一印象是使用排序算法,然后取最大六个。明显面试官不满意,我也知道肯定不是这么简单的问题,但当时脑袋空白想不到什么高效的方法。在回去的路上开始思考这个问题,真正静下来后感觉问题变简单了,很快想到了一个思路。 问题的关键点在于只需要取最大的六个,于是这样一个思路就出来了。...原创 2018-08-20 22:22:59 · 291 阅读 · 0 评论 -
java.lang.IllegalStateException: The maximum number of cell styles was exceeded
POI导出execl时在本地测试没有异常,在发布到正式环境后报上面的异常,原因是在for循环里创建了HSSFCellStyle style = wwb.createCellStyle()对象,所有当导出数据很多时就会报上面的异常,解决办法:将HSSFCellStyle style = wwb.createCellStyle();放在循环外面就可以了。原创 2015-03-29 19:37:44 · 7595 阅读 · 0 评论 -
简单文件服务器和客户端
很多的web项目中都会涉及到用户上传图片然后保存到服务器。如果将图片直接放到项目中会造成一些麻烦: 1. 打包发布项目时会丢失已上传的图片, 2. 当图片越来越多时会对性能造成一定的影响所以,将图片从web项目中分离出来,建立一个独立的图片服务器是很有必要的,下面给一个简单的图片服务器接收图片或其它文件的例子和使用URL上传图片或文件到服务器的例子,支持中文文件名。原创 2015-03-29 19:59:27 · 748 阅读 · 0 评论 -
javacv使用笔记
javacv使用笔记一.前言最近在做一个视频审核的功能,但是运营觉得每个视频都要看一篇太浪费时间了,于是提出了这样一个需求,给每个视频随机截取5张图片展示出来,根据这5张图片决定是否需要继续观看视频内容,以提高审核效率。既然运营提出了这样的需求,就得尽力去完成。二.准备首先从感性的角度分析该需求肯定可以实现的,毕竟软件开发技术已经是相当成熟了。只是暂时不知道什么技术可以实现该功...原创 2017-01-22 11:12:59 · 26362 阅读 · 12 评论 -
java并发锁之Lock
写这篇文章的主要目的是记录,如果能帮到一些人那也是及好的。 JDK1.5在并发包java.util.concurrent.locks中增加了新的并发编程接口Lock(以及相关实现类)。Lock提供了与synchronized关键字类似的同步功能,但需要在使用时手动获取和释放锁。 Lock相关接口: l void lock():获取锁,调原创 2017-05-15 10:36:47 · 403 阅读 · 0 评论 -
Map常用实现类总结
原创 2017-05-08 09:22:34 · 1320 阅读 · 0 评论 -
java基本数据结构之List常用实现类总结
1. ListList是一个有序的集合接口。可以通过一个位置索引进行新增、删除、查找元素。它允许重复的元素。2. AbstractListList接口的抽象实现类,它提供了List接口的一些基本实现。3. ArrayList最常用的List接口实现类,底层使用可变长度的动态数组实现。ArrayList有一个初始容量(capacity = 10),当元素数量大于初始容量时进行原创 2017-05-18 15:57:56 · 1533 阅读 · 0 评论 -
SPRING MVC工作原理
Spring MVC简介Spring MVC是一个开源的web开发框架, Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。它以零配置,性能优,开发效率高和与spring无逢集成等优点被广大java开发者所喜爱。Spring MVC和struts2是目前最流行的MVC开发框架。 Spring MVC工作原理Spring原创 2017-10-10 14:01:11 · 591 阅读 · 0 评论 -
学习深入理解java虚拟机笔记--对象已死吗
在堆里面存放着java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经"死去"(即不可能再被任何途径使用的对象)。 1. 引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。原创 2017-10-15 09:19:27 · 227 阅读 · 0 评论 -
java中Thread类的join方法
单核cpu运行多线程时底层实现原理是多个线程间切换,由于cpu的处理速度很快,看上去像多个线程同时运行。那么我们如何实现让线程T1,T2,T3,在T1执行完成后才执行T2,T2执行完成后才执行T3,也就是线程的串行化,通过Thread类的join方法就可以实现。join方法:将该线程加入当前线程,当前线程等待加入线程执行完成才继续执行。例子:public class Threa原创 2017-11-13 13:21:03 · 5419 阅读 · 0 评论 -
Lock与synchronized的区别
Lock的公平锁与非公平锁:公平锁(FairSync):直接将获取锁的操作放到等待队列中,谁先抢到锁谁先执行。非公平锁(NoFairSync): 先获取锁,获取到则执行,未获取到则放入等待队列。因为从线程进入了RUNNABLE状态,可以执行开始,到实际线程执行是要比较久的时间的。而且,在一个锁释放之后,其他的线程会需要重新来获取锁。其中经历了持有锁的线程释放锁,原创 2017-11-13 15:30:40 · 219 阅读 · 0 评论 -
CyclicBarrier和CountDownLatch的区别
1. 字面意思CyclicBarrier : 循环的屏障CountDownLatch : 向下计数锁2. 用途CyclicBarrier : 让指定的线程等待,直到所有线程达到同一执行点全部继续执行CountDownLatch : 让线程等待,直到CountDownLatch计数到0,继续执行该线程。3. 主要方法:CyclicBarrier :原创 2017-12-08 13:34:23 · 304 阅读 · 0 评论 -
使用ControllerAdvice获取controller接口@ResponseBody返回值
前言:接口类项目开发时,为了便于后期查找问题,一般会拦截器或过滤器中记录每个接口请求的参数与响应值记录,请求参数很容易从request中获取,但controller的返回值无法从response中获取,有一个简单的方法,在controller接口的最后将返回值保存到request域中,这种方法虽然简单,但是开发起来太麻烦,需要在每个controller的最后添加一行代码,且该功能不属于业务原创 2017-12-11 17:28:38 · 9396 阅读 · 0 评论 -
logback使用日志工具类静态方法打印日志
最近开发时突然感觉每次需要打印日志信息时都要在当前类中定义一个Logger对象特别的麻烦,所以就在想能不能使用一个日志工具类里面定义一些打印日志的静态方法,这样在需要打印日志时直接使用工具类的静态方法。 有了这个想法后就开始尝试,其实这个需求很简单,看下面例子:public class LoggerUtil { private final static原创 2017-12-12 11:40:46 · 10328 阅读 · 0 评论 -
poi导出excel工具类
poi版本 org.apache.poi poi 3.17 org.apache.poi poi-ooxml 3.17 /** * Excel导出工具类 * @author zsc * @datetime 2017年12月14日 下午8:01:32 */public class Exce原创 2017-12-18 19:08:44 · 982 阅读 · 0 评论 -
java利用jxl读写excel表格
package com.kjlink.test;import java.io.File;import java.io.IOException;import jxl.Cell;import jxl.Sheet;import jxl.Workbook;import jxl.read.biff.BiffException;import jxl.write.Label;im原创 2013-02-19 17:35:57 · 2540 阅读 · 0 评论 -
一个简单的内存缓存管理器,可设置过期时间
目前主流的大项目都使用ehcache,redis等第三方缓存做分布式缓存管理。然而中小项目一般并没有很多的数据需要使用缓存,如果引用第三方缓存不仅增加开发难度,也使项目更加复杂,维护起来更麻烦。例如,一个项目只需要做验证码错误次数的验证,这时使用内存缓存不仅简单而且高效,后期维护容易。import java.util.Calendar;import java.util.Map;import j...原创 2018-02-09 10:56:28 · 5055 阅读 · 0 评论 -
自定义线程池工具类
import java.util.concurrent.*;/** * 线程池工具类: * 处理项目中需要异步处理的任务,例如日志服务,监控服务等 * @author zsc * @datetime 2017年11月22日 上午11:04:09 */public class ThreadPoolUtil { /** 工具类,构造方法私有化 */ private Thre...原创 2018-04-18 16:36:09 · 1637 阅读 · 0 评论 -
POI实现excell批注背景图片(仿html浮窗显示图片)
公司客户需要从系统中导出一些带图片的excel报表,因为图片的大小不固定,所以如果直接放在excel中会导致严重变形。公司的客服说以前有个客户发给她这样一个excel表格,在excel中显示小图片,鼠标放到小图片后显示大图片,鼠标移走后大图片隐藏(类似html页面的浮窗)。我让她把这个excel表格发给我看看,但她说找不到了。我当时觉得不太可能,而且还有很多其它工作需要去完成,所以没有仔细去研究。原创 2015-03-15 15:13:27 · 3425 阅读 · 0 评论