
JavaDev
文章平均质量分 82
java记录dev
-代号9527
逢山开路,遇水搭桥!纸上得来终觉浅,绝知此事要躬行。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
分页数据不准问题分析与解决
记录一个分页不准的问题。原创 2025-06-19 19:56:33 · 1240 阅读 · 0 评论 -
Guava限速器RateLimiter
项目中一个方法中用了两个不同的限流器RateLimiter对象,多线程调用这个方法,突然想到会不会死锁,但一分析就知道不会,这是令牌,不是锁🔒,令牌不存在释放不释放的问题,令牌一直在生产新的,被卡住的地方,总会因为得到令牌而继续往下执行,这和死锁是有本质区别的。预热期3秒,也就是说,在开始的 3 秒内,令牌生成速率会从一个较低的值逐步提升到 5 个 / 秒,最终的效果是每秒5个令牌,预热型的限流器,多用在冷启动系统上,如数据库、Redis等,框架默认的冷因子3.0。原创 2025-06-19 08:15:00 · 756 阅读 · 0 评论 -
coding习惯 + Bug记录整理
整理些平时不好的coding习惯导致的bug📝。原创 2025-06-16 19:15:54 · 226 阅读 · 0 评论 -
线程池相关疑问点整理
在分析这个疑惑前,先看一个另一个问题,通过这个问题,可以看明白请求和线程这两个概念5,10,60,// @Bean定义第二个线程池@Overridetry {if (!5,10,60,此时,点击shutdown,会跳转到我们重写后,优雅关闭线程池的shutdown方法,但其实没必要自己写子类,直接使用Spring封装的ThreadPoolTaskExecutor即可。原创 2025-06-16 18:29:14 · 1060 阅读 · 0 评论 -
@SchedulerLock处理Spring Task在分布式环境下的重复执行问题
@SchedulerLock处理Spring Task在分布式环境下的重复执行问题原创 2025-06-12 17:32:50 · 1042 阅读 · 0 评论 -
基于数据库实现配置管理和定时任务启停
基于数据库实现配置管理和定时任务启停原创 2025-06-12 15:56:32 · 323 阅读 · 0 评论 -
Maven相关问题:jna版本与ES冲突 + aop失效
本文记录了Maven依赖升级过程中遇到的问题及解决方法。主要涉及:1)JNA与Elasticsearch的依赖冲突,通过升级ES版本并使用dependencyManagement解决;2)环境升级导致AOP失效,发现新版本openfeign不再包含aop依赖,需手动引入;3)okhttp Bean找不到问题,通过升级依赖版本解决。总结指出大版本升级时需注意API重构、依赖变化和兼容性问题,建议做好影响评估。全文约150字,涵盖了依赖冲突、AOP失效等典型问题的排查思路和解决方案。原创 2025-06-06 19:24:00 · 1209 阅读 · 0 评论 -
启停@Scheduled定时任务的方式
这种改法,是给一个不存在的时间,或者一个很久远的时间,从而保证任务触发不了,但cron = "-"是直接禁用,任务根本不会被注册到调度器。这比反射强行取就好多了:需要注意的是,Set集合无序,LinkedHashSet有序,这里放心转,源码里就是LinkedHashSet。前面借助Spring框架,实现了定时任务统一管理,再换种实现方式:一个接口,子类任务写定时任务,注入List对象。一个个的定时任务服务,实现上面的接口,并写自己的@Scheduled定时任务。这个属性没有get方法,但有一个类似的。原创 2025-06-06 14:36:22 · 1182 阅读 · 0 评论 -
线程池RejectedExecutionException异常
java.util.concurrent.RejectedExecutionException:原创 2025-06-03 23:14:06 · 538 阅读 · 0 评论 -
不可变集合类型转换异常
throw UnsupportedOperationException在日常开发用的也很多,一个接口,不同的策略,有时候某一个实现类并不需要实现接口的某一个方法,此时可以直接抛这个异常。如上,使用Collections.unmodifiableList包装后得到的集合,其不可被更新,但原始被包装的集合,还是可以更改。都会创建独立副本,后续对 original 的修改不会影响副本,区别是:前者返回的一个可变集合,后者则是一个严格的不可变集合。此时的集合,不可被更新,自然也不能被类型转换,如。原创 2025-05-29 15:57:56 · 917 阅读 · 0 评论 -
配置文件拉取的安全问题 + 索引建立影响评估
处理了一个安全工单,业务系统拉取外部配置时,未开启权限校验,比如SpringBoot项目一部分配置放在配置中心Nacos,而通过接口拉取Nacos配置时,不需要权限校验,这样会导致知道项目在配置中心appid的人,可以通过接口随意拉取和更改配置。关键点:安全性 + 环境变量的使用。原创 2025-04-08 16:05:18 · 338 阅读 · 0 评论 -
SpringBoot2.x与SnakeYaml的不兼容问题
刚开始处理这个问题时,先是看到一个帖子下的另一个方案:自己改SnakeYaml2.x的依赖,加上那些被移除但Spring Boot2启动要用的方法和API,然后重新打包后引入。很明显,SnakeYaml版本做了大升级了,一些API被移除了,但我当前的Spring Boot启动又要用到,导致了版本不兼容的问题。于是,直接引入2.0的依赖应该就好了,也不用execution做依赖排除,因为直接依赖优先级高于间接依赖。近期扫描服务中引入的依赖是否有安全漏洞。原创 2025-03-05 20:46:57 · 1136 阅读 · 0 评论 -
策略模式环境类的实现方式对比
以后要新增6.x的处理器逻辑,只需新增实现 ClusterMetaDataProcessor 的 Bean,无需修改现有的代码,符合开闭原则。原创 2025-02-26 23:20:53 · 1177 阅读 · 0 评论 -
线程池的使用 + MD5加密 + 枚举类
整理下近期干活儿遇到的一些坑。原创 2025-02-17 20:06:37 · 460 阅读 · 0 评论 -
谷歌浏览器中编辑并重发请求
有时候,需要调整请求参数后,重新发送请求,查看响应,从浏览器搬到Postman太繁琐,可直接在浏览器进行编辑并重发。原创 2024-11-06 15:48:22 · 4573 阅读 · 1 评论 -
ApplicationContextAware接口的用途
Spring 只会自动管理被标注为 Bean 的类,因此,如果类A没有被注册成Bean,那你在类A中,用@Resource注入其他的对象,是不能成功的,哪怕被注入类对象是一个Bean。() 方法,将当前的 ApplicationContext 注入到实现类中,此时,想获取哪个Bean都直接拿就行,就像上面的工具类。如上,A这个类的对象,并不会被Spring管理,因此,不管B这个类是否是一个Bean,上面的注入都不会成功。ApplicationContextAware接口,原创 2024-11-06 00:33:04 · 1057 阅读 · 0 评论 -
Caffeine缓存库的LoadingCache:缓存计算或查询结果
Caffeine 是一个高性能的 Java 缓存库,旨在提供快速、灵活和高效的缓存解决方案。原创 2024-11-01 10:39:51 · 1463 阅读 · 0 评论 -
ConcurrentHashMap的使用场景
,因此,考虑使用ConcurrentHashMap。原创 2024-10-31 19:31:34 · 941 阅读 · 0 评论 -
Java中调用第三方接口
考虑到远程调用可能失败,失败后重试三次,以上面的hutool为例来实现,其余的都一样,主要还是一个是否成功标记位 + 一个计数,successFlag不用voilate,并发安全也不用考虑,线程内部调用的,用到的数存栈里了都。上面的RestTemplate,在调三方接口时挺好用的,但微服务架构下,各个微服务之间调用时,url就不好写,由此,用Feign:一个声明式的http客户端。和getForEntity的区别是,getForObject只有一个响应的内容,响应码、响应头等没有。原创 2024-09-04 01:00:28 · 2654 阅读 · 1 评论 -
同步、异步、回调函数
测试效果的话,就new A(),然后调用其a方法就行,上面代码没有进行必要的日志打印和Thread.sleep模拟异步停顿,可能视觉效果不明显,但意思就是这个意思。此时,方法a调用methodB,没问题,但以后再有方法c调用methodB,但其回调逻辑变了,是call_back_2呢?也即,如果方法a需要在方法b执行完成后,再做一点其余操作,或者说需要对方法b的执行结果进行监听呢 ==> 回调函数。如此,传入对应的Callback接口的实现类,就能在B类中调用对应的回调逻辑,类B一般也就不用更改了。原创 2024-09-02 18:43:21 · 975 阅读 · 0 评论 -
JSON处理库 -- Fastjson
实现FastJson的SerializeFilter接口,进行高度的定制化自定义序列化。PropertyFilter用于序列化时过滤掉特定的属性@Override// 例如,排除所有值为 null 的属性= null;// 示例// 设置属性NameFilter用于序列化时修改字段的名称@Override// 例如,将字段名转为大写ValueFilter用于序列化时,修改字段的值@Override// 例如,将所有字符串值转为大写。原创 2024-09-01 22:16:33 · 1313 阅读 · 0 评论 -
Java分布式锁
一个微服务有多个实例,或者说多个pod,也就有多个JVM,此时,想保证不同实例里的线程同步执行,靠synchronized这种JVM级别的锁就不能实现了,而要通过分布式锁,一种独立于JVM之外的锁原创 2024-08-26 01:21:34 · 1787 阅读 · 2 评论 -
git回退未commit、回退已commit、回退已push、合并某一次commit到另一个分支
在一个分支修改代码后,还没commit提交,不想要这些修改了,想回到刚开始的样子。在一个分支修改代码并commit到了本地仓库,但没push到远程仓库,想回到刚开始的样子。最近一次的push我不要了原创 2024-07-31 13:31:39 · 2477 阅读 · 0 评论 -
系统数据加密传输的实现
针对以上要加密的数据,用户密码处理的流程图如下:修改注册后端接口,用户注册时,提交密码,前端用公钥对密码进行加密后,传到后端服务器。对邮箱名、手机号等信息,可非对称加密,也可使用AES对称加密,实现加密传输,加密落库则可有可无,如果选择了加密落库,可能会影响到之前的userList接口等等,总之明文、密文别转换叉了。修改后端登录接口,登录时,前端传来的密码,解密后传到SpringSecurity框架,如果账户是加密传输的,也需解密,因为框架里要loadUserByUsername,用户名得转换过来。原创 2024-07-10 20:26:04 · 2609 阅读 · 0 评论 -
策略模式 + 抽象工厂实现多方式登录验证
每种登录就是实现登录这个目的的一种策略,因此先想到的应该是策略模式,所有具体策略类所需要实现的接口就是抽象策略类的login方法。其次,前端传不同的type,要调用不同的具体策略类对象,如此,再引入工厂模式。因为不同的第三方供应商系统有不同的认证方式,想实现打通,就要有不同的具体策略类(比如策略类A是通过appid完成认证,策略类B是通过密钥完成认证),因此考虑使用了策略模式。这样写,以后再增加新的登录方式,工厂类还得改,为了解耦,使用配置文件,不同的登录方式的type,对应一个登录方式的具体策略类。原创 2024-06-24 20:02:38 · 1950 阅读 · 0 评论 -
线程池的使用:批量导入、数据汇总、异步保存搜索记录
也可以使用CountDownLatch,线程池的线程每处理一个提交的任务,就让CountDownLatch减一(CountDownLatch初始化等待计数等于批次数),阻塞请求过来的那个线程,直到CountDownLatch减为0,最后统计下总耗时,返回给前端。在一个电商网站中,用户下单之后,需要查询数据,数据包含了三部分:订单信息、包含的商品、物流信息。搜索时,保存历史搜索记录。用户搜索一个keyword时,存历史搜索记录,不能影响到查询的性能,用异步去处理,将存历史记录的任务提交到线程池。原创 2024-06-12 17:08:22 · 1682 阅读 · 0 评论 -
Java后端设置服务器允许跨域
简言之就是发送OPTION请求到服务器,服务器根据预检请求的请求头信息,自行判断是否允许跨域,并把判断结果放到响应的header中返回给浏览器。预检请求的请求头中包含了一些关键信息,例如请求方法、请求头字段、请求的URL等。这个示例中,浏览器向 https://www.example.com 发送了一个OPTIONS请求,用于检查是否允许发送POST请求,并且是否允许包含Content-Type请求头字段。以下通过servlet的Filter给所有响应的header加了一些跨域相关的数据,以实现允许跨域。原创 2024-03-25 17:44:17 · 2893 阅读 · 0 评论 -
拖动排序与置顶的Java实现
整理个需求的实现思路。原创 2024-03-16 09:00:00 · 1323 阅读 · 0 评论 -
用k8s私有化部署docsify做开放API平台
参照模板:【工行的API开放平台】API开放平台,用于给第三方系统做接入用,开放的自然也是用于对接的那部分API。主要有两类:前者简单,后者得考虑鉴权、限流等问题。这类API开放平台不需要考虑在线调用,能展示就行,实现方式可考虑:关于第三种的具体思路:关于API文档内容的维护,可考虑采用上传word文档或者在线富文本框的方式,提到后端,后端转md或其他前端需要的格式后,返回给前端。这种实现类似工行的开放平台,优点是灵活,自己爱咋展示咋展示,维护、上下架接口、编辑、删除都可以做成一个前端页面,可以在线操作,原创 2024-01-25 19:15:53 · 1667 阅读 · 1 评论 -
注解实现校验接口传参是否超出取值范围
Target(ElementType . FIELD) @Constraint(validatedBy = ListValue . ValidIfInRange . class) //借助@Constraint注解实现自定义校验逻辑,validatedBy属性是数组类型,可同时定义多种校验逻辑 @Retention(RetentionPolicy . RUNTIME) @Documented public @interface ListValue {原创 2024-01-17 18:42:02 · 900 阅读 · 0 评论 -
SpringBoot对接支付宝完成扫码支付
需求:系统A对接支付宝,实现支持用户扫码支付。原创 2023-12-22 20:13:08 · 2141 阅读 · 4 评论 -
局部变量类型推断:val和var
翻项目代码,好多地方在用val定义变量,这里整理下。原创 2023-12-11 10:45:28 · 584 阅读 · 0 评论 -
SpringBoot整合ZXing创建二维码和条形码
之前SpringSecurity时,登录用到了图片验证码辅助登录:【】,以下为整合zxing实现二维码和条形码的生成。原创 2023-12-11 09:08:58 · 894 阅读 · 0 评论 -
反射加载SDK完成统一调用
半路接手一个需求,需要从自己系统出发,经过的统一校验和转发,来请求第三方供应商系统的接口,整理下看同事代码学到的一点思路。原创 2023-12-08 11:15:35 · 1101 阅读 · 0 评论 -
@JsonCreator和@JsonValue
此时,前端传个dto(json)过来,dto里有个参数的类型是枚举类型,反序列化json成dto对象时,枚举类型的属性也会反序列化,上面@JsonCreator定义的unSerializer方法执行,就会完成参数合法性校验,Service层省事了。比如一个枚举类的get方法上加上该注解,那么在序列化这个枚举类的对象时,返回的就是枚举对象的这个属性,而不是这个枚举对象的序列化json串。一个类只能用一个,加上这个注解时,该类的对象序列化时就会只返回这个字段的值做为序列化的结果。原创 2023-11-23 09:49:54 · 3479 阅读 · 0 评论 -
Java计算时间差,距结束还有几天几小时几分钟
上面的toHours()方法返回的是时间差全部换算为小时的数值,而不时去掉整天以后的整小时,想获得后者,应该调用toHoursPart()方法原创 2023-11-22 15:28:07 · 1646 阅读 · 2 评论 -
ApplicationContext对象的获取
ApplicationContext 代表 Spring IoC 容器,其中包含应用程序创建的所有 Bean。它负责实例化、配置和创建 Bean。原创 2023-11-07 20:07:50 · 1743 阅读 · 0 评论 -
【Java】cron表达式
L和W可以一起组合在日字段使用。表示当月的最后一个工作日触发事件原创 2023-10-05 18:22:16 · 1053 阅读 · 0 评论 -
Java中的Lambda表达式与双冒号::的用法
Lamdba是Java1.8的一大亮点,它会使代码更加简洁通过Lambda,可以代替之前用匿名内部类去实现接口Lambda表达式的本质是一个匿名函数。原创 2023-09-14 11:25:23 · 1705 阅读 · 0 评论 -
Java 正则表达式的用法与实例
Java 正则表达式的用法--邮箱格式验证实例原创 2022-06-15 15:07:07 · 2955 阅读 · 0 评论