随笔分类 - software engineering / Java
摘要:需求: 将复杂JSON数据解构为扁平化数据,插入数据库对应的一张表上,供业务更直观地查询/阅览数据。 思路: 使用Jackson将数据转成JsonNode对象,然后通过递归解构至JsonNode不在为对象为止,然后put到一个LinkedHashMap中去,以此实现数据结构的扁平化变换。 需要的Ja
阅读全文
摘要:以前对接很多老系统的接口是发现对方返回的JSON往往有些不太对劲,例如 { "key_1":"A", "key_2":"{\"name\":\"Tom\"}" } 由于鄙人下海以来一直使用SpringBoot自带的Jackson,因此不清楚此现象产生的原因,然而最近在对接一个接口时,我自己使用Fas
阅读全文
摘要:最近在接入接口时,需要提供一个客户端生成的唯一ID,因此写了一个简单的唯一ID生成的工具类(有bug请勿使用) public class IdGenerator{ /** * CAS计数器 */ private static AtomicInteger counter = new AtomicInt
阅读全文
摘要:对于第三方接口调用日志这个功能,笔者在工作中曾见过以下两种方式: Restemplate+装饰者模式+MQ实现 网关监控 + Feign拦截器 + 观察者模式实现 其中观察者模式的实现是我最为佩服的设计(站在了一种很新的角度来解决问题),个人认为以上两种实现都显得略过臃肿,应该简化设计,让异步记录的
阅读全文
摘要:Spring Boot 2.2 是第一个正式支持 JUnit 5 的版本。 因此在写测试类的时候,JUnit4和JUnit5是有一点区别的。JUnit4需要需要两个注解 @SpringBootTest @Runwith(SpringRunner.class) Junit5的测试类则只需要一个注解 @
阅读全文
摘要:最近在请求https接口的时候,发生了异常: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SuncertPathBuilderExceptio
阅读全文
摘要:参数常见枚举值 O(Optional):表示参数是可选的。 M(Mandatory):表示参数是必填的。 其他可能的枚举值 R(Required):与“M”相似,表示参数是必需的。 C(Conditional):表示参数的必填性取决于其他参数的值或某些条件。 D(Default):表示参数有默认值,
阅读全文
摘要:AOP(面向切面编程)是一种编程范式,它的目的是通过将横切关注点(如日志记录、事务管理、异常处理等)从主要业务逻辑中分离出来,以提高代码的模块化和可维护性。在异常处理方面,有人认为使用AOP来实现异常捕获能够提供更优雅的解决方案,相比于传统的try-catch块。 以下是一些可能的优势和注意事项:
阅读全文
摘要:DEFAULT_INITIAL_CAPACITY是HashMap的初始化容量,默认16 DEFAULT_LOAD_FACTOR是HashMap的负载因子默认是0.75,这意味着当HashMap的键值对数量达到了容量的75%时,HashMap就会进行扩容,桶数组的长度将翻倍。 TREEIFY_THRE
阅读全文
摘要:Metaspace(元空间)是用于存放所有被加载类的元数据信息的内存区域 Heap(堆)是一块用于存储对象实例的内存区域。它是Java虚拟机中最大的一块内存区域,也是所有线程共享的内存区域。 堆在Java虚拟机中具有以下特点: 存储对象实例:堆主要用于存储动态创建的对象实例。在Java程序运行过程中
阅读全文
摘要:volatile 关键字 volatile 是 Java 中的关键字,用于修饰变量。它的作用是确保对被修饰变量的读写操作具有可见性和顺序性。 可见性:当一个线程修改了 volatile 变量的值,其他线程可以立即看到最新的值。这是因为 volatile 变量在修改时会强制将最新的值刷新到主内存中,并
阅读全文
摘要:AbortPolicy:抛出RejectedExecutionException异常,拒绝该任务的执行。
阅读全文
摘要:private static final ThreadLocal<Integer> THREAD_LOCAL = new ThreadLocal<>(); @Test void threadLocalTest() { Assertions.assertDoesNotThrow(() -> { //
阅读全文
摘要:Reentrantlock默认是非公平锁 private static ReentrantLock lock = new ReentrantLock(); 若想实现公平锁,只需使用重载构造器,fair参数传入true private static ReentrantLock lock = new R
阅读全文
摘要:synchronized 关键字用于实现对象级别的同步,它可以保证多个线程在访问某个对象时的互斥性,避免并发访问导致的数据竞争和不一致 public class BankAccount { private BigDecimal balance; public BankAccount(String i
阅读全文
摘要:webhook直译就是——网络钩子,该如何理解webhook呢? 可以从银行卡余额入手: 当账户没有开通短信提醒功能时,用户想知道账户余额时,就必须主动查询,才能实时获取当前真实余额。 当账户开通了短信提醒功能,每次余额的变更,银行会主动发短信,实时发送当前真实余额给用户。 用户和银行就是两个系统,
阅读全文
摘要:资源效率: NIO 允许在单个线程上处理多个连接。传统的基于线程池的模型为每个连接分配一个线程,如果连接数量巨大,会导致大量线程占用系统资源,而 NIO 则可以通过少量线程来处理大量连接,节省了系统资源。 非阻塞: NIO 提供了非阻塞的网络操作,允许一个线程管理多个连接的 I/O 操作。这意味着一
阅读全文
摘要:在prod环境,项目所触发的运行时异常,developer往往无法第一时间得知讯息(在没有项目监控的前提下),为了解决这一问题,可以利用钉钉机器人监控项目异常,实时通知/警报给developer。 1> 自定义紧急异常EmergencyException 2> 在重要业务中产生的异常转换为此异常 3
阅读全文
摘要:ApplicationEventPublisher 是 Spring 框架中的一个接口,用于发布应用程序事件。它定义了一个名为 publishEvent 的方法,用于发布事件。 在程序内部一些简单的通信场景,可以优先选择ApplicationEventPublisher来处理,或者项目没有配备MQ中
阅读全文
摘要:public ResponseEntity<byte[]> file() { String path = "C:\\Users\\Administrator\\Desktop\\result.pdf"; File file = new File(path); try { byte[] fileByt
阅读全文