JavaDev
文章平均质量分 82
java记录dev
-代号9527
逢山开路,遇水搭桥!纸上得来终觉浅,绝知此事要躬行。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
容器信号传递与 PID 1 进程分析
在容器里,只有 PID = 1 的进程能收到 K8s 发来的 SIGTERM 信号原创 2026-08-27 22:07:09 · 500 阅读 · 0 评论 -
服务注册与注销时机 - 优雅退出实践
服务优雅上下线原创 2026-08-27 21:01:29 · 402 阅读 · 0 评论 -
受控生命周期:SmartLifecycle 接口
/ 从 Lifecycle 继承// 从 Phased 继承// SmartLifecycle 自己的方法stop();“大先关,小后关;大后启,小先启”高 phase =“高级别乘客”最后上飞机(后启动),最先下飞机(先关停)低 phase =“经济舱乘客”最先上飞机(先启动),最后下飞机(后关停)是"分层的串行"层与层之间严格串行(按 phase),层内可以并行(如果你自己实现异步)。原创 2026-08-19 17:22:40 · 424 阅读 · 0 评论 -
@PreDestroy 执行机制与超时配置
Spring容器中@PreDestroy方法的串行执行机制 摘要:Spring容器在关闭时,所有@PreDestroy方法会在同一个线程内串行执行,这是框架硬编码的不可配置行为。通过源码分析发现销毁流程为:1)发布ContextClosedEvent事件;2)执行SmartLifecycle.stop();3)单线程逆序销毁单例Bean(包括@PreDestroy方法)。这种串行执行方式可能导致总耗时超过K8s的terminationGracePeriodSeconds(默认30秒),使后续销毁步骤(如服务原创 2026-07-31 20:19:40 · 475 阅读 · 0 评论 -
Bug记录整理
文章摘要:使用BeanUtils.copyProperties进行对象拷贝时,当源类和目标类的同名属性类型不同(如Map和List),可能导致拷贝失败。文中通过重写setter方法试图解决Map到List的转换问题,但发现Spring和Hutool的BeanUtils工具对setter方法的选择策略不同,导致拷贝结果不一致。其中Spring的BeanUtils会优先匹配属性类型,而Hutool的BeanUtil则可能选择不匹配的setter方法,造成属性拷贝为空的问题。原创 2026-04-20 15:08:28 · 149 阅读 · 0 评论 -
接口要考虑轻量和下游服务的压力
本文记录了一次迭代发布引发的问题及思考。背景是核心服务A新增特性X引入服务B,但B未多地域部署。新迭代导致前端在多个页面频繁调用特性X的API,造成两个问题:1)单点服务B面临崩溃风险;2)无权限用户频繁收到弹窗提示。解决方案包括评估B服务负载、加强监控、前端紧急修复减少调用。最终反思指出:需求开发需全面评估服务压力、中间件负载,并兼顾代码性能和用户体验,才能确保产品稳定性。原创 2025-12-04 19:53:06 · 464 阅读 · 0 评论 -
Java一个方法中返回多个数据值的实现
本文介绍了在Java中实现方法返回多个值的6种方案:1)自定义对象封装;2)JDK14+的record关键字;3)使用第三方框架如Apache Commons的Pair/Triple类;4)类型一致的List集合;5)键值对Map;6)通过参数传递空对象填充。对比分析了各方案的优缺点,建议非临时场景优先使用自定义类或record,临时简单数据可使用Pair类,而List/Map则适合快速原型开发。文章通过代码示例展示了不同实现方式,并总结出适用场景和注意事项。原创 2025-10-24 16:39:54 · 765 阅读 · 0 评论 -
分页数据不准问题分析与解决
记录一个分页不准的问题。原创 2025-06-19 19:56:33 · 1769 阅读 · 0 评论 -
Guava限速器RateLimiter
项目中一个方法中用了两个不同的限流器RateLimiter对象,多线程调用这个方法,突然想到会不会死锁,但一分析就知道不会,这是令牌,不是锁🔒,令牌不存在释放不释放的问题,令牌一直在生产新的,被卡住的地方,总会因为得到令牌而继续往下执行,这和死锁是有本质区别的。预热期3秒,也就是说,在开始的 3 秒内,令牌生成速率会从一个较低的值逐步提升到 5 个 / 秒,最终的效果是每秒5个令牌,预热型的限流器,多用在冷启动系统上,如数据库、Redis等,框架默认的冷因子3.0。原创 2025-06-19 08:15:00 · 1616 阅读 · 0 评论 -
coding习惯 + Bug记录整理
整理些平时不好的coding习惯导致的bug📝。原创 2025-06-16 19:15:54 · 463 阅读 · 0 评论 -
线程池相关疑问点整理
在分析这个疑惑前,先看一个另一个问题,通过这个问题,可以看明白请求和线程这两个概念5,10,60,// @Bean定义第二个线程池@Overridetry {if (!5,10,60,此时,点击shutdown,会跳转到我们重写后,优雅关闭线程池的shutdown方法,但其实没必要自己写子类,直接使用Spring封装的ThreadPoolTaskExecutor即可。原创 2025-06-16 18:29:14 · 1251 阅读 · 0 评论 -
@SchedulerLock处理Spring Task在分布式环境下的重复执行问题
@SchedulerLock处理Spring Task在分布式环境下的重复执行问题原创 2025-06-12 17:32:50 · 1476 阅读 · 0 评论 -
基于数据库实现配置管理和定时任务启停
基于数据库实现配置管理和定时任务启停原创 2025-06-12 15:56:32 · 542 阅读 · 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 · 1554 阅读 · 0 评论 -
启停@Scheduled定时任务的方式
这种改法,是给一个不存在的时间,或者一个很久远的时间,从而保证任务触发不了,但cron = "-"是直接禁用,任务根本不会被注册到调度器。这比反射强行取就好多了:需要注意的是,Set集合无序,LinkedHashSet有序,这里放心转,源码里就是LinkedHashSet。前面借助Spring框架,实现了定时任务统一管理,再换种实现方式:一个接口,子类任务写定时任务,注入List对象。一个个的定时任务服务,实现上面的接口,并写自己的@Scheduled定时任务。这个属性没有get方法,但有一个类似的。原创 2025-06-06 14:36:22 · 1542 阅读 · 0 评论 -
线程池RejectedExecutionException异常
java.util.concurrent.RejectedExecutionException:原创 2025-06-03 23:14:06 · 864 阅读 · 0 评论 -
不可变集合类型转换异常
throw UnsupportedOperationException在日常开发用的也很多,一个接口,不同的策略,有时候某一个实现类并不需要实现接口的某一个方法,此时可以直接抛这个异常。如上,使用Collections.unmodifiableList包装后得到的集合,其不可被更新,但原始被包装的集合,还是可以更改。都会创建独立副本,后续对 original 的修改不会影响副本,区别是:前者返回的一个可变集合,后者则是一个严格的不可变集合。此时的集合,不可被更新,自然也不能被类型转换,如。原创 2025-05-29 15:57:56 · 1291 阅读 · 0 评论 -
配置文件拉取的安全问题 + 索引建立影响评估
处理了一个安全工单,业务系统拉取外部配置时,未开启权限校验,比如SpringBoot项目一部分配置放在配置中心Nacos,而通过接口拉取Nacos配置时,不需要权限校验,这样会导致知道项目在配置中心appid的人,可以通过接口随意拉取和更改配置。关键点:安全性 + 环境变量的使用。原创 2025-04-08 16:05:18 · 435 阅读 · 0 评论 -
SpringBoot2.x与SnakeYaml的不兼容问题
刚开始处理这个问题时,先是看到一个帖子下的另一个方案:自己改SnakeYaml2.x的依赖,加上那些被移除但Spring Boot2启动要用的方法和API,然后重新打包后引入。很明显,SnakeYaml版本做了大升级了,一些API被移除了,但我当前的Spring Boot启动又要用到,导致了版本不兼容的问题。于是,直接引入2.0的依赖应该就好了,也不用execution做依赖排除,因为直接依赖优先级高于间接依赖。近期扫描服务中引入的依赖是否有安全漏洞。原创 2025-03-05 20:46:57 · 1813 阅读 · 0 评论 -
策略模式环境类的实现方式对比
以后要新增6.x的处理器逻辑,只需新增实现 ClusterMetaDataProcessor 的 Bean,无需修改现有的代码,符合开闭原则。原创 2025-02-26 23:20:53 · 1319 阅读 · 0 评论 -
线程池的使用 + MD5加密 + 枚举类
整理下近期干活儿遇到的一些坑。原创 2025-02-17 20:06:37 · 791 阅读 · 0 评论 -
谷歌浏览器中编辑并重发请求
有时候,需要调整请求参数后,重新发送请求,查看响应,从浏览器搬到Postman太繁琐,可直接在浏览器进行编辑并重发。原创 2024-11-06 15:48:22 · 7682 阅读 · 1 评论 -
ApplicationContextAware接口的用途
Spring 只会自动管理被标注为 Bean 的类,因此,如果类A没有被注册成Bean,那你在类A中,用@Resource注入其他的对象,是不能成功的,哪怕被注入类对象是一个Bean。() 方法,将当前的 ApplicationContext 注入到实现类中,此时,想获取哪个Bean都直接拿就行,就像上面的工具类。如上,A这个类的对象,并不会被Spring管理,因此,不管B这个类是否是一个Bean,上面的注入都不会成功。ApplicationContextAware接口,原创 2024-11-06 00:33:04 · 1207 阅读 · 0 评论 -
Caffeine缓存库的LoadingCache:缓存计算或查询结果
Caffeine 是一个高性能的 Java 缓存库,旨在提供快速、灵活和高效的缓存解决方案。原创 2024-11-01 10:39:51 · 1871 阅读 · 0 评论 -
ConcurrentHashMap的使用场景
,因此,考虑使用ConcurrentHashMap。原创 2024-10-31 19:31:34 · 1235 阅读 · 0 评论 -
Java中调用第三方接口
考虑到远程调用可能失败,失败后重试三次,以上面的hutool为例来实现,其余的都一样,主要还是一个是否成功标记位 + 一个计数,successFlag不用voilate,并发安全也不用考虑,线程内部调用的,用到的数存栈里了都。上面的RestTemplate,在调三方接口时挺好用的,但微服务架构下,各个微服务之间调用时,url就不好写,由此,用Feign:一个声明式的http客户端。和getForEntity的区别是,getForObject只有一个响应的内容,响应码、响应头等没有。原创 2024-09-04 01:00:28 · 3093 阅读 · 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 · 1261 阅读 · 0 评论 -
JSON处理库 -- Fastjson
实现FastJson的SerializeFilter接口,进行高度的定制化自定义序列化。PropertyFilter用于序列化时过滤掉特定的属性@Override// 例如,排除所有值为 null 的属性= null;// 示例// 设置属性NameFilter用于序列化时修改字段的名称@Override// 例如,将字段名转为大写ValueFilter用于序列化时,修改字段的值@Override// 例如,将所有字符串值转为大写。原创 2024-09-01 22:16:33 · 1483 阅读 · 0 评论 -
Java分布式锁
一个微服务有多个实例,或者说多个pod,也就有多个JVM,此时,想保证不同实例里的线程同步执行,靠synchronized这种JVM级别的锁就不能实现了,而要通过分布式锁,一种独立于JVM之外的锁原创 2024-08-26 01:21:34 · 1953 阅读 · 2 评论 -
git回退未commit、回退已commit、回退已push、合并某一次commit到另一个分支
在一个分支修改代码后,还没commit提交,不想要这些修改了,想回到刚开始的样子。在一个分支修改代码并commit到了本地仓库,但没push到远程仓库,想回到刚开始的样子。最近一次的push我不要了原创 2024-07-31 13:31:39 · 3069 阅读 · 0 评论 -
系统数据加密传输的实现
针对以上要加密的数据,用户密码处理的流程图如下:修改注册后端接口,用户注册时,提交密码,前端用公钥对密码进行加密后,传到后端服务器。对邮箱名、手机号等信息,可非对称加密,也可使用AES对称加密,实现加密传输,加密落库则可有可无,如果选择了加密落库,可能会影响到之前的userList接口等等,总之明文、密文别转换叉了。修改后端登录接口,登录时,前端传来的密码,解密后传到SpringSecurity框架,如果账户是加密传输的,也需解密,因为框架里要loadUserByUsername,用户名得转换过来。原创 2024-07-10 20:26:04 · 3279 阅读 · 0 评论 -
策略模式 + 抽象工厂实现多方式登录验证
每种登录就是实现登录这个目的的一种策略,因此先想到的应该是策略模式,所有具体策略类所需要实现的接口就是抽象策略类的login方法。其次,前端传不同的type,要调用不同的具体策略类对象,如此,再引入工厂模式。因为不同的第三方供应商系统有不同的认证方式,想实现打通,就要有不同的具体策略类(比如策略类A是通过appid完成认证,策略类B是通过密钥完成认证),因此考虑使用了策略模式。这样写,以后再增加新的登录方式,工厂类还得改,为了解耦,使用配置文件,不同的登录方式的type,对应一个登录方式的具体策略类。原创 2024-06-24 20:02:38 · 2375 阅读 · 0 评论 -
线程池的使用:批量导入、数据汇总、异步保存搜索记录
也可以使用CountDownLatch,线程池的线程每处理一个提交的任务,就让CountDownLatch减一(CountDownLatch初始化等待计数等于批次数),阻塞请求过来的那个线程,直到CountDownLatch减为0,最后统计下总耗时,返回给前端。在一个电商网站中,用户下单之后,需要查询数据,数据包含了三部分:订单信息、包含的商品、物流信息。搜索时,保存历史搜索记录。用户搜索一个keyword时,存历史搜索记录,不能影响到查询的性能,用异步去处理,将存历史记录的任务提交到线程池。原创 2024-06-12 17:08:22 · 1933 阅读 · 0 评论 -
Java后端设置服务器允许跨域
简言之就是发送OPTION请求到服务器,服务器根据预检请求的请求头信息,自行判断是否允许跨域,并把判断结果放到响应的header中返回给浏览器。预检请求的请求头中包含了一些关键信息,例如请求方法、请求头字段、请求的URL等。这个示例中,浏览器向 https://www.example.com 发送了一个OPTIONS请求,用于检查是否允许发送POST请求,并且是否允许包含Content-Type请求头字段。以下通过servlet的Filter给所有响应的header加了一些跨域相关的数据,以实现允许跨域。原创 2024-03-25 17:44:17 · 3117 阅读 · 0 评论 -
拖动排序与置顶的Java实现
整理个需求的实现思路。原创 2024-03-16 09:00:00 · 1664 阅读 · 0 评论 -
用k8s私有化部署docsify做开放API平台
参照模板:【工行的API开放平台】API开放平台,用于给第三方系统做接入用,开放的自然也是用于对接的那部分API。主要有两类:前者简单,后者得考虑鉴权、限流等问题。这类API开放平台不需要考虑在线调用,能展示就行,实现方式可考虑:关于第三种的具体思路:关于API文档内容的维护,可考虑采用上传word文档或者在线富文本框的方式,提到后端,后端转md或其他前端需要的格式后,返回给前端。这种实现类似工行的开放平台,优点是灵活,自己爱咋展示咋展示,维护、上下架接口、编辑、删除都可以做成一个前端页面,可以在线操作,原创 2024-01-25 19:15:53 · 1869 阅读 · 1 评论 -
注解实现校验接口传参是否超出取值范围
Target(ElementType . FIELD) @Constraint(validatedBy = ListValue . ValidIfInRange . class) //借助@Constraint注解实现自定义校验逻辑,validatedBy属性是数组类型,可同时定义多种校验逻辑 @Retention(RetentionPolicy . RUNTIME) @Documented public @interface ListValue {原创 2024-01-17 18:42:02 · 1039 阅读 · 0 评论 -
SpringBoot对接支付宝完成扫码支付
需求:系统A对接支付宝,实现支持用户扫码支付。原创 2023-12-22 20:13:08 · 2629 阅读 · 4 评论 -
局部变量类型推断:val和var
翻项目代码,好多地方在用val定义变量,这里整理下。原创 2023-12-11 10:45:28 · 818 阅读 · 0 评论 -
SpringBoot整合ZXing创建二维码和条形码
之前SpringSecurity时,登录用到了图片验证码辅助登录:【】,以下为整合zxing实现二维码和条形码的生成。原创 2023-12-11 09:08:58 · 1168 阅读 · 0 评论
分享