- 博客(9)
- 收藏
- 关注
原创 Shutdown Hook 中的日志去哪了?log4j2 shutdown hook 机制探究
日志去哪了把一个服务去掉 SpringBoot 依赖的时候,发现 shutdown hook 运行不正常了,有开始执行的日志,执行完成的却没有。重现也很方便,新建一个 maven 工程,增加一个启动类,如下@Slf4jpublic class Application { public static void main(String[] args) { log.info("start application..."); Runtime.getRuntime()
2021-04-04 20:02:00
1151
原创 使用 Maven Embedder 通过代码执行 maven 命令
如果有个需求是要通过代码调用 maven 命令,来上传 jar 包或进行其他操作,该如何实现?调用命令行当然可以,maven 官方也有一个项目 Apache Maven Invoker 实现类似需求,但前提是服务运行的机器或者容器中需要有 maven。大家可能都听说过 Write once, run anywhere. 如果没了 maven 环境就执行不了了,有没有更好的方式呢Maven Embedder 也是 maven 官方的一个项目,如名字一样,是可嵌入的,也就是不需要依赖外部 maven。项目
2020-11-07 18:12:32
915
3
原创 API 测试利器 WireMock
之前写了一篇介绍 HttpClient 的两种重试机制 的文章, 但是否真的会按照预期进行重试我们不得而知。别人提供给我们的 API 往往都是正常的,很多错误并不能稳定重现,这也造成了我们无法进行全面的测试。正是这种情况下,了解到了 WireMock。本文不打算做一个入门教程,重点在于如何用 WireMock 解决实际的问题。WireMock 官网的文档很不错,想要深入了解的可以去阅读一下。初始化调用端首先初始化一个HttpClientpublic ZwroksApi(){ Request
2020-11-05 21:23:37
338
原创 HttpClient的两种重试机制
本文基于HttpClient 4.5.13使用 http 请求外部服务时,由于网络或者服务本身的不稳定性,经常需要重试。重试当然可以通过手撸代码实现,但更好的方式是通过现有的机制去实现。HttpClient 中支持两种重试:异常重试。服务不可用重试。异常重试HttpClient 执行时会抛出两种异常:java.io.IOExceptionClientProtocolExceptionjava.io.IOException 被认为是非致命性且可恢复的,而 ClientProtocolE
2020-11-03 22:00:26
2134
原创 对Redis分布式锁的一点错误理解
Redis 分布式锁在日常工作中经常用到,面试中也是高频问题,自己在看的时候,发现对于 Redlock 理解有些偏差,主要是 Redlock 是在单实例(单集群)还是多实例(多集群)下实现的。查资料的时候发现有这个问题的绝不止我一个,甚至很多人理解都是错的还写博客告诉别人。当然如果你已经知道了,看看我走过的弯路或许也会有些收获。Redis 分布式锁的实现在介绍 Redlock 之前,先看下一般...
2020-04-20 16:14:55
181
原创 Spring Boot 定时调度居然只用单线程?!
为防止打脸,先写明版本:spring boot 2.2.2.RELEASE一spring boot 中自带了一个轻量级的任务调度框架,使用也非常简单。添加注解@EnableScheduling,当然需要放在一个可以被扫描到的类上,比如启动类、使用了@Configuration的配置类。当然你要放在一个@Component的类上除了不太规范,我也无话可说。在需要定时运行的方法上加上@Sch...
2020-01-12 17:43:04
458
原创 [憨读记 之 Effective Java] 01 - 用静态工厂方法代替构造器
书的第一章是创建和销毁对象,接下来的几篇也都是围绕这个展开。本篇对应书中的第一条:用静态工厂方法代替构造器。什么是静态工厂方法先看一个例子,Boolean类中有如下构造器public Boolean(boolean value) { this.value = value;}同时,还提供了如下的静态方法,也可以返回Boolean类实例public static Boolean...
2020-01-04 12:41:52
107
原创 JDBC驱动为什么没加载
使用Class.forName加载驱动使用JDBC连接数据库的时候,需要先加载驱动。可以通过Class.forName声明要加载的驱动,加载这个词在这里其实不太明确,因为Class.forName不只是把类加载到了内存中,还会初始化(static块中的代码会被执行)。注册驱动其实就发生在 static 块中。比如mysql的驱动com.mysql.cj.jdbc.Driverstatic {...
2019-12-14 17:30:30
1504
原创 Spring Cloud Gateway 获取request body(基于源码改造,不走弯路)
在使用Spring Cloud Gateway的过程中,经常需要获取request body,比如用来做日志记录、签名验证、加密解密等等。网上的资料,解决方案五花八门。所以就整理了经过验证且已经在线上使用的两种方法,都是基于官方源码进行扩展。本文使用的Spring Cloud Gateway版本为2.1.1.RELEASE。ModifyRequestBodyGatewayFilterFact...
2019-11-19 09:16:21
4101
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人