Night Field's Blog

Make it work, make it right, make it fast.

设计模式之六大原则

1 概述 在面向对象的编程中,要实现一个功能,可以有非常多的方式。在多年的经验积累总结下来,人们发现优秀的的代码总是遵循一定的范式。其中23种设计模式(Design Patterns),就是前人对优秀代码的编程范式的总结,是面向对象编程的最佳实践。合理地运用这些设计模式,已经是写出高质量,高效率,可读性强,易维护的代码的充要条件。 而设计模式的六大原则,则是设计模式都会遵守的通用法则。本文...

SpringBoot服务无法读取系统变量,我重新认识了profile和bashrc

背景 CentOS服务器上,我们用Systemd部署了一个SpringBoot服务。关于如何部署,可以参考这篇文章。这个SpringBoot服务会用ProcessBuilder去调用机器上一个C++的可执行文件。 问题描述 SpringBoot程序跑得很正常,但是我们发现C++程序却没有log输出,也就是说它从没被执行过。 查看了ProcessBuilder的返回值,是127。127的...

SpringBoot以服务形式启动,并设置JVM启动参数

1 概述 SpringBoot使得我们可以快速地上手以及开发Spring项目。我们可以把工程打成一个jar包,然后部署到服务器上(这里只讨论Linux,因为没多少人会拿Windows当服务器)。nohup命令可以让程序作为后台进程执行,但是它不好管理维护,也显得很不专业。更好的方法是将SpringBoot作为Service启动。 2 步骤 2.1 Maven打包 通过package命...

用Java递归设置文件的用户,组和权限

前言 自从1.7版本开始,Java引入了Nio包,提供了更强大的IO功能。 本文简单介绍如何用java.nio.file.attribute下的工具类修改文件的权限,用户和组。因为本类库是针对Posix类系统的的,所以主要适用于Linux和Mac上(实测Win7不支持)。 测试样例 测试代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1...

解决Unable to open debugger port错误

原因 IntelliJ Debug模式下,启动Tomcat报错Unable to open debugger port 可能的原因有二: 目标端口被占用 文件权限不足 解决 目标端口占用 这种情况比较常见。Tomcat启动需要监听一个端口,如果此端口正好被别的程序占用了,就会报这个错。有两个办法可以解决问题: 1. 调整端口: Run/D...

深入理解ThreadLocal

前言 并发是Java开发中绕不开的一个话题。现代处理器都是多核心,想要更好地榨干机器的性能,多线程编程是必不可少,所以,线程安全是每位Java Engineer的必修课。 应对线程安全问题,可大致分为两种方式: 同步: 用Synchronized关键字,或者用java.util.concurrent.locks.Lock工具类给临界资源加锁。 避免资源争用: 将全...

Java四种引用详解

前言 为了满足对不同情况的垃圾回收需求,从Java从版本1.2开始,引入了4种引用类型(其实是额外增加了三种)的概念。本文将详细介绍这四种引用。 Java 4种引用类型 Java中的4中引用类型分别为强引用(String Reference),软引用(Soft Reference),弱引用(Weak Reference)和虚引用(Phantom Reference)。 概念及应用场景...

如何重启Spring Scheduler

背景 定时任务是一个比较常见的功能,在某些情况下,需要重新启动或者是重设Scheduler Job,但是官方的API上都没有提供类似restart的方法,那该如何完成此需求呢? 方案 Spring Quartz Spring Quartz是一整套完整的Cron Job架构,可以完成复杂的任务调度需求,支持任务持久化,事务化,甚至分布式。如果是基于Spring Quartz做的Sche...

InstanceAlreadyExistsException的解决方案

背景 JMX Java Coder们都知道,Java提供了JMX(Java Management Extensions) attach的机制(如JConsole),可以动态获取JVM运行时的一些信息。我们可以自定义MBean,来暴露指定的一些参数值,如DB连接数等。为方便故障排查,我们添加了一些DB相关的metrics,于是在Spring配置文件里面添加了如下代码 1 2 3 4 5 6...

记一次开源类库PF4J的类卸载Bug排查经历

背景 我们有一个Plugin的管理系统,可以实现Jar包的热装载,内部是基于一个Plugin管理类库PF4J,类似于OSGI,现在是GitHub上一个千星项目。 以下是该类库的官网介绍 A plugin is a way for a third party to extend the functionality of an application. A plugin implemen...