- 博客(17)
- 收藏
- 关注
原创 Java根据参数实现细粒度锁
最近接到一个需求,要求把文档托管到语雀平台上,前端请求一篇文档时从语雀平台的api拉取具体的内容。因为从语雀平台获取文章的内容耗时较长,因此用Map实现了一个简单的缓存操作,这个代码的结构如下public Optional<Document> getDocument(String slug) { Document document = cache.get(slug); if (!isValid(document)) { synchronized (this)
2021-09-29 17:02:09
982
原创 @Cacheable注解配合Redis设置缓存随机失效时间
最近在在学习缓存的相关知识,看到@Cacheable注解可以比较方便地开启缓存。当配合Redis时可以通过RedisCacheManager配置缓存的失效时间。但这个设置对于一个value下的缓存是固定的,而避免缓存雪崩的技巧中有一条就是为不同的缓存条目设置不同的失效时间,这样可以避免所有缓存同时失效。那么要如何实现这样的设置呢?上网搜索后发现有人有相同的疑问,但是全网都没有找到解决方案。那么只能自己尝试解决这个问题了。RedisCacheManager设置的失效时间是如何工作的RedisCache
2021-09-17 15:40:27
2110
3
原创 记录一次外键导致的事务超时问题
背景介绍上周帮同学排查了一个问题,在一行向数据库中插入一条数据库的记录时会稳定地出现事务超时的问题。ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction。但这个表是新建的,此前也没有任何代码会访问这张表,因此出现等待锁的情况非常奇怪。问题分析通过SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;分析,发现是外键导致的等待锁超时。在项目中有任务和子任务的概念,分别存放
2021-07-19 15:07:38
235
原创 EasyConnect分配的虚拟内网ip在本机上不能访问
背景最近参与了一个微服务相关的项目,nacos注册中心在学校内网的服务器上,因此为了在本地调试的时候将服务注册上去,配置了spring.cloud.inetutils.preferred-networks为内网ip的前缀。然而开发过程中遇到了一个问题,在本地启动两个模块后,A模块的请求无法到达B模块,显示连接超时。经过排列组合后发现,A、B都在服务器上,A或B中有一个在服务器上,都可以正常调用。只有A和B两个模块都在本地时不能正常调用。最终排查发现通过EasyConnect分配的内网ip不能访问到本机
2021-06-16 16:26:47
3866
原创 Java线程池ThreadPoolExecutor回收线程时执行资源回收操作
背景一般来说,由于Java有垃圾回收机制存在,只需要确保不要写出内存泄露的代码,不需要手动回收资源。然而有时候Java程序会依赖一些外部的资源,如在线程池中调用浏览器爬取网页时,为了避免频繁打开浏览器,可以在线程启动时打开一个浏览器,之后一直复用,在线程退出时再把浏览器关掉。这样就遇到一个问题,如何在线程池回收非核心线程/线程池关闭时把打开的浏览器关掉?实现方法首先要知道线程池是如何复用线程的。实际上就是在runWorker方法中,通过循环不断获取到任务task,执行run()方法。当任务..
2021-06-16 15:59:13
1749
原创 远程Redis服务器 JedisConnectionException: Failed connecting to host localhost:6379 解决方案
问题最近接手了一个旧的项目,在服务器上成功运行后想把部分服务在本地启动进行调试,启动过程中出现了一个错误2021-06-05 17:51:53.776 WARN org.springframework.boot.actuate.redis.RedisHealthIndicator [AbstractHealthIndicator.java:87] ## Redis health check failedorg.springframework.data.redis.RedisConnectionFai
2021-06-05 18:15:55
3405
1
原创 Nacos Spring Cloud 响应配置变化
背景在工作中遇到一个需求,需要在nacos配置变化后接收到事件做出响应。网上搜了一圈发现全是在讲nacos怎么更新配置的,没有找到更新配置后触发一个函数的方法。官方文档在Nacos 官网找到一段这样的信息这上面说在方法上加一个@NacosConfigListener就可以了,结果尝试以后完全没反应。然后下面还有一段这个结果尝试了@NacosInjected和@Autowired,发现这个ConfigService一直是null,后面addListener也执行不了。这咋回事呢。解决问题先
2021-04-06 14:13:25
609
1
原创 Java中final修饰的方法是否可以被重写
这是一次阿里面试里被问到的题目,在我的印象中,final修饰的方法是不能被子类重写的。如果在子类中重写final修饰的方法,在编译阶段就会提示Error。但是回答的时候还是有点心虚的,因为final变量就可以用反射的方法进行修改,我也不太确定是否有类似的机制可以绕过编译器的限制。于是面试之后特地上网搜了下这个问题,这里简单记录一下。首先说一下结论:没有办法能够做到重写一个final修饰的方法,但是有其他的方法可以接近在子类中重新实现final方法并在运行时的动态绑定的效果。这里需要用到一个aop框架叫a
2021-04-06 11:48:58
2360
原创 Java接口的初始化
背景接口与类真正有所区别的是前面讲述的四种“有且仅有”需要开始初始化场景中的第三种:当一个类在初始化时,要求其父类全部都已经初始化过了,但是一个接口在初始化时,并不要求其父接口全部都完成了初始化,只有在真正使用到父接口的时候(如引用接口中定义的常量)才会初始化。 ——《深入理解Java虚拟机:JVM高级特性与最佳实践》这里讲到引用接口中定义的常量会初始化接口,但是书中也写到引用类中的常量不会导致类被初始化,因为编译阶段已经将常量移动到常量池中了,两者的说法有一些矛盾让我很困惑。publi
2021-04-06 11:46:44
812
原创 Selenium Java对WebElement截图出现UnsupportedCommandException异常
最近项目中遇到一个需求,需要对webdriver中的特定元素进行截图,代码如下。WebElement element = remoteWebDriver.findElementByCssSelector((String) target);String screenshot = element.getScreenshotAs(OutputType.BASE64);但是运行后出现了以下错误org.openqa.selenium.UnsupportedCommandException: unknown
2020-12-06 22:18:51
705
原创 简单介绍HTML5 Landmark
最近在进行无障碍相关文档翻译的时候遇到了 landmark 的概念,在网上搜了下发现没有相关的中文资料,因此写一篇博客简单介绍一下。什么是 LandmarkLandmark 是一种用来表示网页组织结构的方法。通常一个网页可以被切分成几个大块...
2020-09-07 01:48:55
1014
1
原创 Selenium RemoteWebDriver 利用CDP修改User-Agent
地球人都知道,如果使用selenium时要修改user-agent可以在启动浏览器时添加配置项,如chromeOptions.addArguments("user-agent=xxx");。但是如何在每次请求的时候动态更改user-agent呢?经过我的不懈努力,终于在网上都到一个相关的信息使用python3和selenium4修改chrome的user-agent。这里面提到了使用driver.execute_cdp_cmd来切换,这让我了解了一下cdp命令。简单的来说,cdp命令时chrome支持的
2020-08-25 23:25:42
5235
6
原创 记录使用Python登录浙江大学统一身份认证
背景现在每天要进行健康情况上报,但是因为经常睡过头忘记打卡,于是想着写一个程序来自动打卡。统一身份认证访问健康情况上报页面(https://healthreport.zju.edu.cn/ncov/wap/default/index)后会先跳转到登录界面输入账号密码登陆以后会发送一个post请求表单里一共有五项内容可以看到,username就是学号,password不是密码的明文,可能是经过了哈希或者加密,authcode一项为空不用管,_eventId应该是提交的意思,而最长的exec
2020-08-16 19:10:12
1717
6
原创 正则匹配中的非贪婪匹配不是最短匹配
最近在工作中遇到一个需求,就是找出html中所有锚文字包含 联系方式 的超链接。刚开始我写了一个很简单的正则来解决这个问题<a.*?联系方式.*?</a。但是在测试的时候却发现这个正则表达式并不像我想象的那样工作。图中给出了一个正则表达式匹配的例子,可以看出在这段文字中有两个匹配,但是第一个匹配所包含的结果已经超出了实际需要的范围,包含了太多的超链接标签,而我需要的是最短的匹配也就是图中横线画出的范围,这是怎么回事?正则匹配的原理这要从正则匹配的原理说起,简单的来说正则匹配是一种贪心的算
2020-06-24 01:59:26
376
1
翻译 IntelliJ IDEA 2020.1 取消了auto-import自动导入
Maven 和 Gradle 导入功能更新v2020.1使得Maven和Gradle更改的导入不再繁琐。首先,我们删除了总是触发的自动导入,以及在更新完脚本之前不断显示并建议导入更新的提示框。取而代之的是,编辑器右上角现在有一个浮动通知,提示您加载更改:现在,对于Windows和Linux,您还可以使用快捷键Ctrl+Shift+O,对于Mac,也可以使用Shift+Cmd+I来加载更改。如果对构建脚本进行了外部更改,例如VCS更新或在IDE外部进行的编辑,则IntelliJ IDEA将自动重新加载
2020-05-22 22:56:30
3193
1
原创 如何让ThreadPoolExecutor更早地创建非核心线程
最近在项目中遇到一个需要用线程池来处理任务的需求,于是我用ThreadPoolExecutor来实现,但是在实现过程中我发现提交大量任务时它的处理逻辑是这样的(提交任务还有一个submit方法内部也调用了execute方法):public void execute(Runnable command) { if (command == null) throw...
2020-04-28 21:14:37
482
1
原创 Spring Boot中只能有一个WebMvcConfigurationSupport配置类
Spring Boot中只能有一个WebMvcConfigurationSupport配置类首先将结论写文章的最前面,一个项目中只能有一个继承WebMvcConfigurationSupport的@Configuration类(使用@EnableMvc效果相同),如果存在多个这样的类,只有一个配置可以生效。推荐使用implements WebMvcConfigurer 的方法自定义mvc配置。...
2020-04-20 14:40:51
1295
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人