
Java
文章平均质量分 80
不如敲代码
这个作者很懒,什么都没留下…
展开
-
KafkaConsumer 消费逻辑
版本:kafka-clients-2.0.1.jarkafkaConsumer 拉取消息的 offset 是存本地的,根据 offset 拉取消息。开启自动提交时,会自动提交 offset 到 broker(在一些场景下会手动检查是否需要提交),防止重启或reblance时 offset 丢失。而本地保存的 offset 是本地拉取到消息时就更新的,所以自动提交的场景下,在消费前过滤掉消息没有影响。原创 2023-11-10 20:14:12 · 1797 阅读 · 0 评论 -
Java snakeyaml 修改yaml文件保留注释工具类封装
snakeyaml 读取 yaml 文件后会丢失文件中的注释,于是写了个工具类用于保留yaml修改前后的注释。原创 2023-06-30 20:11:10 · 2769 阅读 · 2 评论 -
lambda 实现原理及实现获取引用方法
平时写代码经常用到 lambda 表达式,在 mybatis-plus 的动态查询接口中,更是通过 lambda 方式来获取字段名。那么 lambda 到底是怎么实现的呢?mybatis-plus 又是怎么通过 lambda 获取到对应的字段名的?原创 2022-10-31 22:04:25 · 1340 阅读 · 1 评论 -
MybatisPlus 原理学习:一张图了解 mybatisplus 查询流程
`MybatisMapperProxy`:mapper 接口的代理类,创建并缓存每个方法的 mapperMethod 对象,并调用其 execute 方法实现 mapper 方法3. `MybatisMapperMethod`:mapper方法对象,维护对应 mapper 方法的信息(sql 信息,方法参数返回等签名信息),根据 sql 类型调用 sqlSession 不同的方法。 (MP 在这里加了一点分页的处理逻辑,如果返回的是 PageList,则设置 total字段)原创 2022-09-16 15:54:02 · 1450 阅读 · 0 评论 -
单例模式静态内部类实现遇到的类加载失败的坑:ExceptionInInitializerError
背景:写一个工具的时候遇到一个需要使用单例模式的场景,由于该实例消耗资源大且不一定会使用到,因此比较适合用懒汉模式实现。然后直接用的简单高效的静态内部类方式实现。然后就遇到问题了,在首次获取单例对象加载内部类时,会初始化类的静态属性,于是初始化单例对象时如果创建失败(构造方法抛出异常)就会导致内加载失败。并且由于类只会加载一次(加载失败了后面貌似也不会重新加载了),所以后面就一直抛异常,而且异常类型变为 `NoClassDefFoundError`。...原创 2022-07-03 15:03:35 · 995 阅读 · 0 评论 -
MybatisPlus 原理学习:springboot 中 mybatisplus 初始化流程
mybatisPlus 的整个加载过程概括如下:1. `MapperScannerConfigurer` 扫描 mapper 接口,并在 spring 中注册 deanDefinition,类型为 `MapperFactoryBean`2. `SqlSessionFactory` 解析 mapper.xml 和 mapper 接口 中的 sql 语句保存到 Configuration 中,同时加入 mybatisPlus 提供的动态 sql。 最后注册对应 mapper 的 `MybatisMappe.原创 2022-06-19 13:11:40 · 3367 阅读 · 0 评论 -
RabbitMQ 延时消息实现方式
rabbitmq实现延时消息主要有两种方式:死信消息(队列ttl+死信exchange),延时插件;原创 2022-01-03 20:15:22 · 9420 阅读 · 0 评论 -
RabbitMQ 实现固定延时等级的延时消息
文章目录rabbitmq 实现固定延时等级的延时消息大概介绍代码实现简单分析rabbitmq 实现固定延时等级的延时消息通过学习rocketmq延时消息的实现,我们了解到rocketmq将不同延时等级的消息放入不同queue中,然后转发到目标topic。对于未使用rocketmq的团队来说,如果只是为了实现固定延时时间而引入一个新的中间件,成本可能比较大,包括学习使用、运维成本等。但我们也可以仿照rocketmq的方式,结合前面的rabbitmq死信队列,使用rabbitmq实现一个类似rocketm原创 2021-10-07 17:47:59 · 1749 阅读 · 0 评论 -
Redisson 延迟队列实现原理探究
redis也可以用来实现延时消息的功能。理论上也有两种方式订阅 key 过期事件(pub/sub)使用 sorted-set 存储消息,score为消息的过期时间然而实际上订阅过期事件存在诸多问题,所以并不合适:过期事件的不准确,过期时间只在key被删除时才触发,并不是在key过期后就马上删除的pub/sub 不支持持久化,服务器宕机期间的事件会丢失pub/sub 存在丢失的可能,线上使用的redis pub/sub 有丢失过消息(非过期时间)所有的key过期都会发送过期事件,对redi原创 2021-10-04 22:52:58 · 7776 阅读 · 3 评论 -
RocketMQ延时消息实现原理探究
由于日常开发中遇到几次使用延时消息的场景,而且目前业务中使用到的消息中间件有rabbitmq和kafka,对延时消息的支持都不太理想。其中rabbitmq 延时消息是通过 设置队列ttl+死信exchange实现缺点嘛:每次都得设置两个队列,一个用来实现延时,过期后经死信exchange转到对应的业务队列提供消费。另:rabbitmq有提供延时插件,但缺点较多,如:1. 启动插件要么重启,要么引入一个新的集群;2. 不支持高可用,延时消息发送前只存储在当前broker节点的内部数据库Mnesia原创 2021-10-03 19:48:40 · 3987 阅读 · 0 评论 -
反射在项目中的使用:根据字段名动态过滤,以及一点点优化
反射是Java中比较重要的一个知识点,但平时可能用的有点少。最近刚好用到了,就记下来。需求首先简要描述一下需求:有一个对象需要投递到消息队列中,但需要根据配置文件中的过滤条件进行过滤。目前只有两个条件,后期可能会增加。过滤条件为消息字段。实现例如有一个User类, 目前只根据userId过滤public class User implement Serializable { private Integer userId; private String name; priva原创 2021-03-13 16:33:56 · 379 阅读 · 1 评论 -
Java实现验证码,算式验证码,附源码,开箱即用
在登陆或注册的时候,为了防止程序恶意请求,网站一般都会要求输入验证码。之前也写了一篇关于验证码功能的文章 java springboot 使用Kaptcha组件实现验证码功能,但是感觉这个组件只有字符串验证码,功能不太强。于是准备自己写一个验证码,主要是实现算式验证码。所有功能已实现并上传只github,链接:https://github.com/wsJava/verification-code首先是获取算式因为使用 除 会产生小数问题,所以只有+-* 运算符。下面这个方法是生成一个指定运算符数量的算式原创 2020-09-11 21:15:37 · 1472 阅读 · 0 评论 -
springboot 自定义validation参数校验注解 校验枚举值
在写springboot项目的时候,经常需要对参数进行校验。如果是一个参数还好,写一个if-else就好了。但如果传入的参数是一个对象,那就需要写很多if-else了,而且这个对象可能在很多地方作为参数使用。validation 介绍这个时候就可以考虑使用参数校验注解了,首先是引入依赖。<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</原创 2020-09-02 21:32:23 · 4510 阅读 · 0 评论 -
基于POI 框架自己封装一个Excel通用读写小工具
在我们日常开发中,经常会遇到读写excel的需求。或者生成一个excel文件给用户,或者读取解析上传的excel文件。在写过几次读写excel的代码后,我发现其实在读写excel的时候,大部分代码都是一样的,只要具体读写某一行的代码有区别。于是,就打算自己写一个Excel通用读写小工具。以后只需要写一个具体读写行的代码就可以了。这里使用策略模式,将具体读/写 excel行 的方法当作一个策略,然后在读写excel的通用方法中调用它。具体代码如下:定一个 读和写 Row(行)的接口读取接口 Reader原创 2020-08-27 20:32:47 · 351 阅读 · 0 评论 -
Java ImageIO 图片处理后变红 解决办法记录
原因:根据网上搜罗的一大堆文章以及自己的发现,是因为原始图片(jpeg)带有alpha通道才会变红,在mac上直接显示简介的看到。然后发现使用下面这个方式可以解决变红的问题// 把这行换成下面的方式BufferedImage image = ImageIO.read(originFile);// 这里是直接根据url读取图片public static BufferedImage getBufferedImage(String imgUrl) throws MalformedURLExcept原创 2020-08-25 19:45:42 · 2561 阅读 · 4 评论 -
设计模式之单例模式,六种实现,以及反射破解
在介绍设计模式之前,先贴一下设计模式的三种类型,和六大原则。创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。设计模式的六原则开闭原则:对扩展开放,对修改关闭里氏代换原则:任何基类可以出现的地方,子类一定可以出现,(子类原创 2020-08-15 22:13:38 · 217 阅读 · 0 评论 -
基于SpringBoot Redis Cache,封装一个能够批量操作(查询&保存)的缓存
文章目录准备工作代码展示封装 RedisMultiCache.java配置缓存 RedisCacheConfig使用示例需要注意的问题之前的文章:Spring Cache的使用教程:注解形式和api接口形式Guava 本地缓存使用教程在这前面两篇文章中,分别介绍了Spring Cache 和 Guava Cache 的使用,然后一对比就可以发现,Guava Cache 提供了批量查询的接口,而Spring Cache 只有单个查询的接口。那当我们在使用Spring Cache的时候,需要用到批量查原创 2020-08-08 18:00:38 · 2746 阅读 · 0 评论 -
Guava 本地缓存使用教程
文章目录准备工作创建缓存使用缓存Cache 读取缓存LoadingCache 读取缓存修改缓存Cache 修改缓存LoadingCache 修改缓存其他方法在前面的文章 Spring Cache的使用教程:注解形式和api接口形式,以及调用内部方法注解失效的原因 中讲到了在程序开发中,在一些需要复杂或耗时的IO或CPU操作中,我们经常会使用缓存,将操作的结果保存起来,方便下次直接从缓存中读取结果。在上篇文章中,我们用的是Spring Cache,使用Redis作为缓存服务器。然而有些情况下,比如程序原创 2020-08-07 22:59:59 · 3893 阅读 · 0 评论 -
Spring Cache的使用教程:注解形式和api接口形式,以及调用内部方法注解失效的原因
在写程序的时候,对于频繁访问的数据,我们一般会使用缓存,将数据存储在内存中,方便下次直接在内存中读取,而不需要再去查询数据库或者再进行复杂运算得到。Spring Cache 的使用首先介绍一下Spring提供的Cache接口,并且提供了默认的实现 ConcurrentMapCache,看类名就知道,使用的ConcurrentMap实现。这里主要介绍一下注解形式。(另:个人更推荐接口的方式使用缓存,注解使用起来虽然方便,但是控制粒度不够,不能随时随地使用。当然需求简单的话注解就足够了)注解形式的使用首原创 2020-08-02 20:48:56 · 4441 阅读 · 0 评论 -
java8 四大函数式接口 和 用于数据处理的 stream流 使用详解
在之前一篇博客里面介绍了 java8 中的 lambda 表达式,使用lambda表达式可以大大的简化我们的代码,使代码更加简洁、优雅,敲代码的效率也更高。点击链接可以查看: java8 lambda表达式使用详解然而,除了lambda表达式外,还有一个stream流,也可以极大的提高编码效率,并且能够提高代码的可读性。lambda表达式主要用在实现函数接口的地方,而stream流则主要用于处理数据。以下为相关功能介绍。示例首先给一个示例,(结合lambda使用,效率翻倍)@Datapubli原创 2020-07-28 22:24:30 · 1128 阅读 · 0 评论 -
centos7 安装和启动 RabbitMQ
centos 7 安装和使用安装下载相关软件包erlangsocatrabbitmqwget https://www.rabbitmq.com/releases/erlang/erlang-18.3-1.el7.centos.x86_64.rpmwget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x...原创 2020-07-15 19:26:15 · 308 阅读 · 0 评论 -
JVM Java虚拟机学习笔记:jvm内存模型,垃圾回收,引用类型,类加载
文章目录Java 虚拟机线程JVM 内存模型垃圾回收java四种引用类型GC 垃圾收集器JVM 类加载机制Java 虚拟机概念: JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。运行过程:Java 源文件 --> 编译器 --> 字节码文件 ...原创 2020-06-29 09:18:04 · 201 阅读 · 0 评论 -
java8 lambda 表达式使用详解
lambda 表达式可以简化代码, 主要使用场景如下:基础版 ->使用语法(参数) -> {执行语句}如果仅有一个参数, 对应的括号可以省略;只有一条执行语句时, 大括号和return也可以省略;参数类型可以省略使用场景用于实现单一方法的接口, 即函数式接口.例如使用匿名类实现一个Runnable 接口, 传统方式如下Runnable r = new Runable...原创 2020-04-10 17:54:47 · 304 阅读 · 0 评论