Mr.Kail's Blog

  • 标签

  • 分类

  • 归档

  • Docs

Java8 Stream 快速入门

发表于 2018-07-25 | 更新于 2018-08-14 | 分类于 Java | 评论数:

Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合进行各种便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。

很多数据处理的场景不得不脱离 RDBMS,或者以底层返回的数据为基础进行更上层的数据统计。而以前 Java 的集合 API 中,仅仅有极少量的辅助型方法,更多的时候是程序员需要用 Iterator 来遍历集合,完成相关的聚合应用逻辑。这是一种远不够高效、笨拙的方法。

Stream API 借助于 Lambda 表达式,极大的提高编程效率。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。

阅读全文 »

使用 SIGAR 获取操作系统信息

发表于 2018-07-15 | 分类于 Java | 评论数:

Sigar(System Information Gatherer And Reporter)是一个开源的工具,提供了跨平台的系统信息收集的API,核心由C语言实现的。

可以收集的信息包括:

  1. CPU信息: 包括基本信息(vendor、model、mhz、cacheSize)和统计信息(user、sys、idle、nice、wait)
  2. 文件系统信息: 包括Filesystem、Size、Used、Avail、Use%、Type
  3. 事件信息: 类似Service Control Manager
  4. 内存信息: 物理内存和交换内存的总数、使用数、剩余数;RAM的大小
  5. 网络信息: 包括 网络接口信息 和 网络路由 信息
  6. 进程信息: 包括每个进程的内存、CPU占用数、状态、参数、句柄
  7. IO信息: 包括IO的状态,读写大小等
  8. 服务状态信息
  9. 系统信息: 包括操作系统版本,系统资源限制情况,系统运行时间以及负载,JAVA的版本信息等.

系统信息收集API Sigar

阅读全文 »

通过 JMX 获取 JVM 监控数据

发表于 2018-07-08 | 更新于 2018-07-15 | 分类于 Java | 评论数:

本文 提供了一个 Java 工具类,用来获取诸如以下的 JVM 数据:

  • 类加载信息
  • 编译信息
  • 操作系统信息
    • 系统名称、架构、版本、负载 …
    • 物理内存信息
    • CPU 信息
    • 等
  • 运行时信息
    • 进程ID
    • JVM 版本信息
    • 启动参数
    • 系统属性
    • 启动时间、运行时常
    • 等
  • 线程信息
    • 线程状态
    • 死锁检查
    • 等
  • JVM 内存信息
    • 内存使用情况
    • 各个区域内存使用情况
    • 垃圾收集器信息
    • 等
阅读全文 »

JDK1.8.0_151的无限制强度加密策略文件变动

发表于 2018-06-23 | 更新于 2018-06-24 | 分类于 Java | 评论数:

随着越来越多的第三方工具只支持 JDK8,最近公司也计划从 JDK7 升级到 JDK8,在线下环境升级过程中,发现某些项目报以下异常:

1
java.security.InvalidKeyException: Illegal key size

这是因为某些国家的进口管制限制,JDK默认的加解密有一定的限制。
比如默认不允许 256 位密钥的 AES 加解密,解决方法就下载官方JCE无限制强度加密策略文件,覆盖即可。

但是发现公司选用的 1.8.0_151 版本的 $JAVA_HOME/jre/lib/security/ 目录下面多了一个 policy 文件夹,里面还有两个文件夹

1
2
3
4
5
6
├── limited
│   ├── local_policy.jar
│   └── US_export_policy.jar
└── unlimited
├── local_policy.jar
└── US_export_policy.jar

于是搜了一下,发现了这篇文章:Java Unlimited Strength Crypto Policy for Java 9 or 1.8.0_151,以下内容为该文章的翻译。

阅读全文 »

访问域名与请求头Host

发表于 2018-05-27 | 更新于 2018-06-24 | 分类于 Other | 评论数:

最近公司的APP一到星期天的中午就会出现网络异常,只有的移动的网络的有问题,电信和联通都访问正常,排查下来是运营商DNS劫持。
解决方案是使用 HTTP DNS: 绕过 DNS 解析,直接通过 IP 直接访问。
如通过 http://119.29.29.29/d?dn=blog.kail.xyz,获取 blog.kail.xyz 域名的IP地址,然后通过 IP 直接进行访问。

DNSPod HTTP DNS demo

这里就产生的了一个疑问,一般多个服务会对应有多个域名,但是多个域名会解析到同一个IP入口,入口根据域名通过 Nginx 反向代理,转发到内网不同的服务。如果用IP直接访问,如何判断出来是哪个服务呢?

阅读全文 »

国际电话号码格式

发表于 2018-05-06 | 更新于 2018-06-16 | 分类于 Other | 评论数:

E.164 是国际电话编号计划,它可以确保 PSTN 上的每个设备具有全球唯一的号码,使得 电话和短信 正确路由到不同国家的个人电话。 E.164号码格式化为 [+] [国家代码] [用户号码,包括地区代码],最多可以有15位数字。

公共交换电话网(Public Switched Telephone Network 或 简称 PSTN)是一种用于全球语音通信的电路交换网络,是目前世界上最大的网络,拥有用户数量大约是8亿。

阅读全文 »

Windows 下查找和删除进程

发表于 2018-03-28 | 更新于 2018-06-16 | 分类于 Other | 评论数:

这里涉及到的命令有 netstat、findstr、tasklist、taskkill

阅读全文 »

Log4j BufferedIO 与 flush BufferedIO

发表于 2017-06-10 | 更新于 2018-06-16 | 分类于 Java | 评论数:

使用 Log4j 默认写日志的时候,默认会立即刷到文件中,如果日志写入量很大的话,会带来一定的性能损耗。所以Log4j提供了BufferedIO配置选项,如果配置BufferedIO为true,则使用 BufferedWriter 进行包装,写入数据量到达 bufferSize 之后,才会真正写到文件中:

1
2
3
4
// public class FileAppender extends WriterAppender
if(bufferedIO) {
fw = new BufferedWriter(fw, bufferSize);
}

Avoiding the flush operation at the end of each append results in a performance gain of 10 to 20 percent. However, there is safety tradeoff involved in skipping flushing. Indeed, when flushing is skipped, then it is likely that the last few log events will not be recorded on disk when the application exits. This is a high price to pay even for a 20% performance gain.

官方解释了使用 Buffer 会带来 10% ~ 20% 的性能提升,但是代价也是很明显是,假如系统退出,由于最后写入的日志 Buffer 还没满,无法写入文件会导致关键日志丢失。

文本主要解决使用Buffer之后,所带来的以下两个问题:

  1. 当程序关闭的时候,由于一部分日志还在内存中导致的日志丢失问题
  2. 由于日志无法实时输出,给问题排查带来了困难,程序报错无法立马看到报错的信息
阅读全文 »

Java 泛型信息真的全都擦除了吗

发表于 2017-06-09 | 更新于 2018-06-16 | 分类于 Java | 评论数:

JDK5 引入了泛型,为了保持跟 JDK5 之前兼容性,Java采用 泛型擦除 的机制来引入泛型。
所以说 Java 的泛型实际上是伪泛型,其仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换的麻烦。
在运行期,Java的泛型将被擦除,使用强转的形式来进行(类似于Integer value = (Integer) map.get("key"))。

阅读全文 »

自定义 Spring RestTemplate Message Converters

发表于 2017-06-07 | 更新于 2018-06-16 | 分类于 Spring | 评论数:

org.springframework.core.ParameterizedTypeReference 是 Spring 3.2 之后新增的类,使用 RestTemplate 请求数据反序列化的时候,通过该类可以保留泛型。

Spring 对 Jackson 是默认支持的,当 classpath 下有 Jackson 的时候,Spring 会使用 Jackson 进行反序列化,但是配合 ParameterizedTypeReference 的时候有个”bug”,假如请求到的 json 数据里面的字段比 目标 bean 里面的字段多,就会报一下的异常:

1
2
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "..."
.... 省略若干

这里只测试了 3.2.18.RELEASE、4.0.7.RELEASE 、4.2.9.RELEASE 都存在该问题,到目前为止Spring4的最后一个版本4.3.9.RELEASE 则没有该问题。

如果公司的Spring 版本在 3.2 ~ 4.2 之间徘徊,并且不考虑升级Spring版本的话,接下来内容可能会对您有用。

阅读全文 »

自定义 ClassLoader

发表于 2017-05-29 | 更新于 2018-06-16 | 分类于 Java | 评论数:

ClassLoader(类加载器)是负责加载class文件到JVM的抽象类。
扩展 Java 虚拟机动态加载类的方式,需要继承 ClassLoader,并重写findClass()或loadClass()等方法。

阅读全文 »

javassist 入门

发表于 2017-05-28 | 更新于 2018-06-16 | 分类于 Java | 评论数:

Javassist 是一个操作 Java 字节码的类库,通过它可以直接操作 Java 的 .class 字节码文件。

阅读全文 »

case..esac 与 开机启动

发表于 2017-05-24 | 更新于 2018-06-16 | 分类于 Linux | 评论数:

标题是‘case..esac 与 开机启动’,但是两者并没有关系。
本文主要记录了 使用case..esac条件语句写一个Shell脚本 管理一个Java程序,并使其能跟随系统启动。

阅读全文 »

使用网易云跟帖

发表于 2017-05-14 | 更新于 2018-06-16 | 分类于 Other | 评论数:

刚开始评论使用的是多说,不幸的是撂挑子了;
后来用了一段时间友言,发现是在是渣的不行,服务器不行,老是挂,连官方博客的评论都挂了也没人管;
这次吸取经验,使用黄易的“网易云跟帖”,毕竟是大厂,应该不会甩手不干吧。

这里基于 Hexo 的 next 主题进行修改,集成网易云跟帖 评论。

阅读全文 »

婚礼

发表于 2017-04-28 | 更新于 2018-10-07 | 分类于 Other | 评论数:

婚纱照
今天是我们的婚礼
阅读全文 »

Spring @Profile 和 @Conditional 注解

发表于 2017-04-15 | 更新于 2018-06-16 | 分类于 Spring | 评论数:

@Profile 和 @Conditional 都可以根据条件加载指定的Bean。@Profile主要使用场景是用来跟环境绑定,不同的环境加载不同的Bean;@Conditional可用定时更详细的加载条件。

阅读全文 »

使用 json-path 解析 json 数据

发表于 2017-03-17 | 更新于 2018-06-16 | 分类于 Java | 评论数:

JsonPath 表达式可以用 类似 XPath 解析 XML 文档 的方式来解析 JSON 结构。

JsonPath expressions always refer to a JSON structure in the same way as XPath expression are used in combination with an XML document

阅读全文 »

Spring Boot 下 paoding-rose-jade 的多数据源配置

发表于 2017-03-16 | 更新于 2018-06-16 | 分类于 Spring | 评论数:

对于给定的一个DAO接口,如 com.mycompany.myapp.dao.UserDAO,jade 为其配置数据源的默认方式如下:

  • 如果存在 id/name 为 jade.dataSource.com.mycompany.myapp.dao.UserDAO 的数据源,则使用它作为这个DAO的数据源,否则逐级询问配置,直到顶一级包名:jade.dataSource.com
  • 如果以上仍未能确定 UserDAO 的数据源,且 UserDAO 接口上的 @DAO的catalog属性非空(假设其值为myteam.myapp),则视myteam.myapp等同于package名,执行前一个步骤的问询,即按此顺序问询Spring容器的配置:jade.dataSource.myteam.myapp.UserDAO,…,jade.dataSource.myteam
  • 如果以上仍未能确定UserDAO的数据源,则判断是否存在id/name为jade.dataSource、dataSource的数据源
  • 如果以上仍未能确定UserDAO的数据源,则最终就是没有数据源,运行时将会有异常抛出

以上默认数据源的寻找步骤摘录自 JadeBeanFactoryPostProcessor.java 的 类注释,点击查看。

阅读全文 »

Spring Boot 集成 paoding-rose-jade

发表于 2017-03-14 | 更新于 2018-06-16 | 分类于 Spring | 评论数:

paoding-rose 是一个开源框架, 它可以简化 web 应用和 RDMS 应用的开发。

因为公司的原因,所以才有幸接触到了这个小众且‘古老’的框架。其依赖 Spring 的一套体系,主要对 Controller 和 DAO 层提供支持。

Controller 跟 Spring MVC 比较类似,但是相对Spring MVC来说功能稍弱一点,自我感觉可以完全被 Spring MVC 替代掉;
DAO 又跟 MyBatis 比较类似,相对轻量一些,实际上是对 JdbcTemplate 的封装,并添加注解/SQL自定义标签等支持,使用起来很方便。

paoding-rose 跟其他主流框架如此类似,为什么还会选择它呢?
个人感觉可能是跟它的很多“强制限制”有关,paoding-rose 规定 Controller 层 类必须以Controller结尾,必须写在 controller包下面;
DAO 层都是接口,命名必须以 DAO 结尾,必须写在 dao 包下面等等一些强制的要求,否者项目就跑不起来。
跟约定大于配置这个概念有点类似,但是其又不提供配置,必须按照要求来,这些强制的编码要求使开发相对来说规范起来,对后期维护是有益的。

这里在 Spring Boot 中引入 paoding-rose-jade(DAO支持)模块,本文作为记录。

阅读全文 »

Java 内建反编译工具 — javap

发表于 2017-03-05 | 更新于 2018-06-16 | 分类于 Java | 评论数:

javap 是Java内建的一个反编译(反汇编)工具,可以拆解一个或者多个.class文件(disassembles one or more class files)。

阅读全文 »
1234
杨凯彬

杨凯彬

菜鸟会飞

73 日志
11 分类
52 标签
© 2015 – 2020 杨凯彬
由 Hexo 强力驱动
|
主题 – NexT.Mist