Loading

随笔分类 -  Java

摘要:前提 笔者做小数据和零号提数工具人已经有一段时间,服务的对象是运营和商务的大佬,一般要求导出的数据是Excel文件,考虑到初创团队机器资源十分有限的前提下,选用了阿里出品的Excel工具EasyExcel。这里简单分享一下EasyExcel的使用心得。EasyExcel从其依赖树来看是对apache 阅读全文
posted @ 2020-09-12 10:53 throwable 阅读(16206) 评论(1) 推荐(7) 编辑
摘要:前提 很早之前就打算看一次JUC线程池ThreadPoolExecutor的源码实现,由于近段时间比较忙,一直没有时间整理出源码分析的文章。之前在分析扩展线程池实现可回调的Future时候曾经提到并发大师Doug Lea在设计线程池ThreadPoolExecutor的提交任务的顶层接口Execut 阅读全文
posted @ 2020-08-27 22:07 throwable 阅读(2525) 评论(6) 推荐(11) 编辑
摘要:前提 这篇文章主要分析一下Introspector(内省,应该读xing第三声,没有找到很好的翻译,下文暂且这样称呼)的用法。Introspector是一个专门处理JavaBean的工具类,用来获取JavaBean里描述符号,常用的JavaBean的描述符号相关类有BeanInfo、Property 阅读全文
posted @ 2020-08-11 08:55 throwable 阅读(1302) 评论(0) 推荐(0) 编辑
摘要:前提 Snowflake(雪花)是Twitter开源的高性能ID生成算法(服务)。 上图是Snowflake的Github仓库,master分支中的REAEMDE文件中提示:初始版本于2010年发布,基于Apache Thrift,早于Finagle(这里的Finagle是Twitter上用于RPC 阅读全文
posted @ 2020-08-10 09:08 throwable 阅读(2421) 评论(0) 推荐(2) 编辑
摘要:前提 最近有点懒散,没什么比较有深度的产出。刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期、状态切换以及线程的上下文切换等等。编写本文的时候,使用的JDK版本是11。 Java线程的实现 在JDK1.2之后,Java线程模型已经确定了基于操作 阅读全文
posted @ 2020-08-05 12:51 throwable 阅读(711) 评论(0) 推荐(0) 编辑
摘要:背景 最近有一个数据统计服务需要升级SpringBoot的版本,由1.5.x.RELEASE直接升级到2.3.0.RELEASE,考虑到没有用到SpringBoot的内建SPI,升级过程算是顺利。但是出于代码洁癖和版本洁癖,看到项目中依赖的MyBatis的版本是3.4.5,相比当时的最新版本3.5. 阅读全文
posted @ 2020-08-02 14:59 throwable 阅读(795) 评论(0) 推荐(2) 编辑
摘要:前提 笔者很久之前就有个想法:参考现有的主流ORM框架的设计,造一个ORM轮子,在基本不改变使用体验的前提下把框架依赖的大量的反射设计去掉,这些反射API构筑的组件使用动态编译加载的实例去替代,从而可以得到接近于直接使用原生JDBC的性能。于是带着这样的想法,深入学习Java的动态编译。编写本文的时 阅读全文
posted @ 2020-06-06 09:37 throwable 阅读(8931) 评论(3) 推荐(5) 编辑
摘要:前提 这篇文章记录的是SonarQube服务搭建的详细过程,应用于云迁移后的PipleLine的代码扫描环节。 笔者有软件版本升级强迫症,一般喜欢使用软件的最新版本,编写此文的时候(2020-05-17)SonarQube的最新版本为8.3.1。 SonarQube简介 SonarQube是一个代码 阅读全文
posted @ 2020-05-17 23:45 throwable 阅读(4775) 评论(0) 推荐(3) 编辑
摘要:前提 最近一两个月花了很大的功夫做UCloud服务和中间件迁移到阿里云的工作,没什么空闲时间撸文。想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能向预先创建的线程中进行变量传递的局限性,刚好有一位HSBC的技术大牛前同事提到了团队引入了trans 阅读全文
posted @ 2020-05-02 12:59 throwable 阅读(5688) 评论(0) 推荐(1) 编辑
摘要:前提 创业小团队,无论选择任何方案,都优先考虑节省成本。关于分布式定时调度框架,成熟的候选方案有XXL-JOB、Easy Scheduler、Light Task Scheduler和Elastic Job等等,其实这些之前都在生产环境使用过。但是想要搭建高可用的分布式调度平台,这些框架(无论是否去 阅读全文
posted @ 2020-04-10 00:09 throwable 阅读(2725) 评论(3) 推荐(2) 编辑
摘要:前提 最近的新项目和数据同步相关,有定时调度的需求。之前一直有使用过Quartz、XXL-Job、Easy Scheduler等调度框架,后来越发觉得这些框架太重量级了,于是想到了Spring内置的Scheduling模块。而原生的Scheduling模块只是内存态的调度模块,不支持任务的持久化或者 阅读全文
posted @ 2020-04-01 23:55 throwable 阅读(11028) 评论(4) 推荐(2) 编辑
摘要:前提 已经很久没深入研究过算法相关的东西,毕竟日常少用,就算死记硬背也是没有实施场景导致容易淡忘。最近在做一个脱敏数据和明文数据匹配的需求的时候,用到了一个算法叫Levenshtein Distance Algorithm,本文对此算法原理做简单的分析,并且用此算法解决几个常见的场景。 什么是Lev 阅读全文
posted @ 2020-03-08 21:35 throwable 阅读(12532) 评论(0) 推荐(3) 编辑
摘要:前提 前面通过五篇文章基本介绍完JSR-310常用的日期时间API以及一些工具类,这篇博文主要说说笔者在生产实战中使用JSR-310日期时间API的一些经验。 系列文章: JSR310新日期API(一)-时区与时间偏移量 JSR310新日期API(二)-日期时间API JSR310新日期API(三) 阅读全文
posted @ 2020-03-03 23:51 throwable 阅读(1721) 评论(0) 推荐(0) 编辑
摘要:前提 作为Java开发者,很多场景下会使用SpringBoot开发Web应用,目前微服务主流SpringCloud全家桶也是基于SpringBoot搭建的。SpringBoot应用部署到服务器上,需要编写运维管理脚本。本文尝试基于经验,总结之前生产使用的Shell脚本,编写一个可以复用的Spring 阅读全文
posted @ 2020-03-01 22:07 throwable 阅读(1566) 评论(0) 推荐(4) 编辑
摘要:前提 最近在看JUC线程池java.util.concurrent.ThreadPoolExecutor的源码实现,其中了解到java.util.concurrent.Future的实现原理。从目前java.util.concurrent.Future的实现来看,虽然实现了异步提交任务,但是任务结果 阅读全文
posted @ 2020-02-16 23:42 throwable 阅读(1503) 评论(0) 推荐(1) 编辑
摘要:前提 Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。 本文主要介绍反射中一个比较难的问题-泛型。 泛型的简介 泛型是在2004年JavaSE 阅读全文
posted @ 2020-02-16 10:55 throwable 阅读(1948) 评论(1) 推荐(1) 编辑
摘要:前提 最近接触到的一个项目要兼容新老系统,最终采用了ThreadLocal(实际上用的是InheritableThreadLocal)用于在子线程获取父线程中共享的变量。问题是解决了,但是后来发现对ThreadLocal的理解不够深入,于是顺便把它的源码阅读理解了一遍。在谈到ThreadLocal之 阅读全文
posted @ 2020-02-14 12:45 throwable 阅读(1651) 评论(1) 推荐(2) 编辑
摘要:背景 最近在做一个新项目的时候引入了一个架构方面的需求,就是需要检查项目的编码规范、模块分类规范、类依赖规范等,刚好接触到,正好做个调研。 很多时候,我们会制定项目的规范,例如: 硬性规定项目包结构中service层不能引用controller层的类(这个例子有点极端)。 硬性规定定义在contro 阅读全文
posted @ 2020-02-12 09:46 throwable 阅读(4163) 评论(0) 推荐(4) 编辑
摘要:前提 回想一下,JDK8是2014年发布正式版的,到现在为(2020-02-08)止已经过去了5年多。JDK8引入的两个比较强大的新特性是Lambda表达式(下文的Lambda特指JDK提供的Lambda)和Stream,这两个强大的特性让函数式编程在Java开发中发扬光大。这篇文章会从基本概念、使 阅读全文
posted @ 2020-02-09 18:18 throwable 阅读(1350) 评论(0) 推荐(1) 编辑
摘要:前提 之前有个打算在学习RabbitMQ之前,把AMQP详细阅读一次,挑出里面的重点内容。后来找了下RabbitMQ的官方文档,发现了有一篇文档专门介绍了RabbitMQ中实现的AMQP模型部分,于是直接基于此文档和个人理解写下这篇文章。 AMQP协议 AMQP全称是Advanced Message 阅读全文
posted @ 2020-02-08 10:34 throwable 阅读(1535) 评论(0) 推荐(1) 编辑