最近开发 BPM 流程编排引擎,需要将部分 Java 方法注册为业务节点供界面上管理业务流程,此时需要获取 Java 方法的签名,其中参数名获取出来是 arg0
, arg1
, arg2
这样的,查询了下文档,.class
文件默认没有包含形式参数名称,因为含有形式参数名称时需要更大的静态及动态空间占用且部分场景形式参数名称会暴露安全敏感方法的信息,需要编译时加上 -parameters
以保留形式参数名称至运行时。
关于 shade jar 作为依赖时因含有传递依赖导致传递依赖被传递的问题
在之前的场景中,我经常使用 Apache Maven Shade Plugin 给 Hive-UDF、Spark 应用等处理应用所需的依赖版本与系统库依赖版本不一致且不能兼容的问题,今天的场景为需要将一个工程的依赖进行重定位,且该工程构建的 fat jar 需要作为依赖被其他工程引入,但是引入后发现虽然设置的类被进行了重定位,但是构建的 jar 中的 pom.xml 依然含有之前的传递依赖,导致可能影响到引入依赖工程的依赖管理,查询了文档,发现这个持续 11 年的问题已经在 maven-shade-plugin 的 3.0.0 版本中被修复。
Reference
NOTES-shading-dependencies
MSHADE-36 Add option to include dependency reduced POM instead of original one - ASF JIRA
Two's complement
此文记录简单的二进制补码与十进制值的转换逻辑,关于补码的更多原理可以参考文末的链接。
Hive #1611
在每日的数据同步任务中,会将在线业务库的数据同步至 Hive,在刚上线的一段时间内,对 Hive 的 SQL 操作每隔十来天会出现 socket read timeout 的异常,该问题导致我经常凌晨收到告警然后起床修复该问题,因为该问题是偶现,不便复现,经过查阅 Hive JDBC 的源码,定位问题为 Hive JDBC 使用了 java.sql.DriverManager
中的静态变量 loginTimeout
的值,而我们的工程中接入了八九种类型的 JDBC 驱动,部分类型还使用了连接池,先看看 java.sql.DriverManager
中的部分源码:
1 | public class DriverManager { |
OutOfMemoryError
关于 JVM 应用的 OOM,首先可以阅读 Oracle 的文档:3.2 Understand the OutOfMemoryError Exception,根据我的经验,大部分都是开发人员的代码问题导致,而关于出现了 OOM 是否应该及时终止应用在 Oracle 的文档中好像也没有明确的说明,但是在 Stack Overflow 上有不少讨论,如:Can the JVM recover from an OutOfMemoryError without a restart,最高票的回答表明 OOM 发生后不是一定要及时终止应用,但是建议终止应用,因为 OOM 后应用可能存在不一致的状态。