java
心之伊始
不抽烟的小程序员,文艺小青年
展开
-
JAVA IO
#JAVA IOIO基础知识I(Input 把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作)O(Output 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作)我们把这两种操作成为IO.以输入为例,我们可以粗略画个草图IO操作有多种方式,不同的实现方式性能上面表现也不一样。我们从内存复制,阻塞时间来分析不同的IO模型的差异,可能更好理解。常见IO模型分类及对比:我们按照次序从左到右 来介绍这几个IO模型:首先我们要知道一个基础共识:所有的系统原创 2020-09-16 16:30:04 · 200 阅读 · 0 评论 -
单元测试
单元测试相关为什么要单元测试首先我们了解下概念,什么是单元测试?单元测试是由开发者编写的一小段代码,用于检验被测代码一个很小的,很明确的功能是否正确。用于判断某个条件(或特定场景下)的某个特定函数的行为是否正确。执行单元测试,是为了证明某段代码的行为和开发者所期望的是否一致。因此,我们要测试的是规模很小的,非常独立的功能片段。通过对所有单独的部分行为建立起信心,确信他们都和我们期望的一致,然后我们才能开始组装和测试整个系统。单元测试目的其实只有一个目的,提高代码健壮性,减少bug率,减少线上故障原创 2020-08-12 13:01:30 · 303 阅读 · 0 评论 -
SpringBoot优雅退出
目录概念原理SpringBoot实现源码分析查看源码我们发现会调用 Lifecycle 的stop()方法 或者调用SmartLifecycle的stop(Runnable var1)方法且isRunning()为ture才会被调用结论概念jvm有shutdownHook机制,中文习惯叫优雅退出。相当于在linux系统中执行SIGTERM(kill ...原创 2020-01-03 15:34:46 · 1502 阅读 · 0 评论 -
MySql支持Emoji表情
现在有一个需求需要存储微信用户名,微信用户名可能包含Emoji表情,我们一般建表都使用UTF-8编码。Emoji表情是4个字节而Mysql的utf8编码最多3个字节,所以数据插不进去。解决方案:需要将Mysql的编码从utf8转换成utf8mb4。单元测试一下报错只修改表的默认字符集不行那怎么办,难道需要mysql后缀配置把字符编码加上。?characterEncodi...原创 2020-01-03 15:07:31 · 391 阅读 · 0 评论 -
java限流器简单实现
package com.zeng.ratelimit;/** * @Description:限流器工厂 * @Author jerry * Date 2020/1/3 9:52 上午 **/public class RateLimiterFactory { public static SimpleRateLimiter getSimpleRateLimiter(RateL...原创 2020-01-03 11:06:52 · 2066 阅读 · 0 评论 -
JAVA自定义EVENTBUS简单实现
package com.wosai.constant;import com.wosai.data.util.CollectionUtil;import com.wosai.eventbus.Event;import com.wosai.eventbus.EventListener;import com.wosai.eventbus.SimpleEvent;import org.slf...原创 2020-01-02 17:45:39 · 1568 阅读 · 1 评论 -
java从HttpServletRequest中获取请求IP地址
public static String getRealIp(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ...原创 2019-12-18 15:47:01 · 2823 阅读 · 1 评论 -
分布式主键生成方案(雪花算法 java)
/** * @Author: jerry * @date: 2019/5/18 22:24 * @Description:生成唯一ID */public class SnowFlakeIdGenerator { // The initial time(2019-01-01) private static final long INITIAL_TIME_STAMP = 1...原创 2019-11-13 15:32:47 · 433 阅读 · 0 评论 -
java Spring体系梳理
如今做Java尤其是web几乎是避免不了和Spring打交道了,但是Spring是这样的大而全,新鲜名词不断产生,学起来给人一种凌乱的感觉,我就在这里总结一下,理顺头绪。SpringSpring 概述Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的(替代更加重量级的企业级Java技术, 尤其是EJB),它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关...原创 2019-11-06 09:36:59 · 185 阅读 · 0 评论 -
Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
原文出处:http://www.cnblogs.com/dolphin0520/p/3920397.htmlJava并发编程:CountDownLatch、CyclicBarrier和SemaphoreJava并发编程:CountDownLatch、CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountD...转载 2019-10-15 14:37:03 · 120 阅读 · 0 评论 -
XStream NullConvertor
public class NullConverter implements Converter { private Map<Class<?>, List<String>> attributes = null; /** * 是否是属性(是属性的不用以单独标签实现) * * @param type * @...原创 2019-01-22 15:03:35 · 786 阅读 · 0 评论 -
关于集群ElasticSearch官方文档的一点记录
集群是活着的、呼吸着的生命一旦你的集群投入生产,你会发现他就开始了他自己的一生。 Elasticsearch 努力工作来保证集群自给自足而且 真就在工作 。不过一个集群也还要有日常照料和投喂,比如日常备份和升级。Elasticsearch 以非常快的速度发布新版本,进行错误修复和性能增强。保持你的集群采用最新版总是一个好主意。类似的,Lucene 持续在发现 JVM 自身的新的和令人惊讶的...原创 2019-01-23 11:49:32 · 146 阅读 · 0 评论 -
分布式锁(Redis)
加锁public class RedisTool {private static final String LOCK_SUCCESS = "OK";private static final String SET_IF_NOT_EXIST = "NX";private static final String SET_WITH_EXPIRE_TIME = ...原创 2019-03-20 09:02:07 · 139 阅读 · 0 评论 -
kafka学习入门
kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性集群保存一些meta信息。一个Topic可以认为是一类消息,每个topic将被分成多个part...原创 2019-03-20 12:19:04 · 166 阅读 · 0 评论 -
消息中间件
消息中间件卡夫卡基础入门其实主要是学习下markdown语法的使用。工作这么久。还不会这个。。。。。Kafka 最早是由 LinkedIn 公司开发一种分布式的基于发布/订阅的消息系统,之后成为 Apache 的顶级项目。特性同时为发布和订阅提供高吞吐量 。Kafka 的设计目标是以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对TB 级以上数据也能保证常数时间的访问性能。即使...原创 2019-06-25 13:12:22 · 675 阅读 · 0 评论 -
Redis java应用端
基本介绍redis中间件。REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(Stri...原创 2019-07-24 09:13:38 · 114 阅读 · 0 评论 -
java日志
历史背景1996年早期,欧洲安全电子市场项目组决定编写它自己的程序跟踪API(Tracing API)。经过不断的完善,这个API终于成为一个十分受欢迎的Java日志软件包,即log4j。后来log4j成为Apache基金会项目中的一员。期间log4j近乎成了Java社区的日志标准。据说Apache基金会还曾经建议Sun引入log4j到java的标准库中,但Sun拒绝了。2002年Java...原创 2019-08-02 14:46:48 · 130 阅读 · 0 评论 -
限流算法和基本应用
简介令牌桶算法令牌桶算法最初来源于计算机网络。在网络传输数据时,为了防止网络拥塞,需限制流出网络的流量,使流量以比较均匀的速度向外发送。令牌桶算法就实现了这个功能,可控制发送到网络上数据的数目,并允许突发数据的发送。令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,...原创 2019-08-15 16:19:34 · 179 阅读 · 0 评论 -
ZIPKIN分布式链路追踪系统
Zipkin是什么Zipkin分布式跟踪系统(Distributed Tracing System);它可以帮助收集时间数据,解决在microservice架构下的延迟问题;它管理这些数据的收集和查找;Zipkin的设计是基于谷歌的Google Dapper论文。每个应用程序向Zipkin报告定时数据,Zipkin UI呈现了一个依赖图表来展示多少跟踪请求经过了每个应用程序;如果想解决延迟问题...原创 2019-09-18 10:25:14 · 281 阅读 · 0 评论 -
方便创建容器对象的工具CollectionUtil
public final class CollectionUtil { /** * 创建一个<code>ArrayList</code>。 */ public static <T> ArrayList<T> createArrayList() { return new ArrayList<...原创 2019-01-16 16:48:39 · 624 阅读 · 0 评论 -
定义排序接口并实现排序功能
public interface Ordered { /** * Useful constant for the highest precedence value. * * @see java.lang.Integer#MIN_VALUE */ int HIGHEST_PRECEDENCE = Integer.MIN_VALUE; ...原创 2019-01-14 11:59:04 · 1710 阅读 · 0 评论 -
Java并发编程:synchronized
作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。Java并发编程:synchronized 虽然多线程编程极大地提高了效率,但是也会带来一定的隐患。比如说两个线程同时往...原创 2018-11-08 11:09:38 · 132 阅读 · 0 评论 -
DataSourceTransactionManager
写一点关于spring事务管理的浅见。目前项目一般有三类事务管理的做法,一是传统的使用JDBC的事务管理,使用DataSource,从数据源中获取connection,通过con的api进行CRUD,手动的进行commit或者rollback。二是应用spring提供的编程式的事务管理三是使用spring的声明式事务处理。想说下关于spring提供的事务管理器DataSourceTransacti...原创 2018-10-30 14:14:18 · 24831 阅读 · 3 评论 -
springboot项目整合分布式定时任务Quartz
springboot中整合分布式定时任务Quartz的模本范例。参考这个配置,十分简便两个bean配置,一个properties文件,一个sql文件,使用的为mysql.QRTZ_tables_mysql_innodb.sql## In your Quartz properties file, you'll need to set # org.quartz.jobStore.dri...原创 2018-10-27 12:37:59 · 3661 阅读 · 0 评论 -
Spring Boot AMQP+RabbitMq
主要解决两个问题:1如何发送/发布消息(将java对象序列化为json),通过使用RabbitTemplate2如何读取消费消息(json反序列化为java对象)使用@RabbitListener注解amqp是一个规范,一种定义了两个系统间通过消息进行交互的协议,而RabbitMQ则是实现了该规范的一个强大的中间件产物。我们通过设置两个监听队列分别演示通用消息的处理及自定义消息...原创 2018-09-04 17:20:18 · 234 阅读 · 0 评论 -
springboot初探拦截器过滤器及监听器
先上一张常见的图。过滤器会在请求进入servlet之前预处理请求,可以修改HttpServletRequest的请求头和请求数据,需要实现java的Filter接口。拦截器则是在请求被Servlet接收后,通过java反射调用方式实现的,自定义拦截器需要实现Interceptor接口,或者继承抽象类AbstractInterceptor。监听器则是会监听域对象的创建和销毁事件。原本的基...原创 2018-07-06 15:16:49 · 140 阅读 · 0 评论 -
java字节字符转换工具类
该工具类作用是字节,字符数组的相互转换(避免重复造轮子),分享给大家public class ConvertUtil { /** * 字节数组转16进制字符串 */ public static String bytes2HexString(byte[] b) { String r = ""; for (int i = 0;...原创 2018-07-24 13:45:37 · 1777 阅读 · 0 评论 -
java类加载机制
JDK类加载器可以大致分为三类,分别是启动类加载器,扩展类加载器,以及应用程序加载器。类加载器就是根据指定全限定名称将class文件加载到JVM内存,转为Class对象。这是jdk为我们提供的几种类加载器。这三者加载类的路径分别为如下: (Bootstrap ClassLoader) 启动类加载器:JAVA_HOME/lib目录下,以及被-Xbootcalsspat...原创 2018-07-18 17:16:43 · 496 阅读 · 0 评论 -
辅助函数
java后台验证手机号,邮箱格式正则匹配:private Integer getType(String account) { String mobile = "^((1[3,5,8][0-9])|(14[5,7])|(17[0,1,6,7,8]))\\d{8}$"; String email = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-...原创 2018-07-24 09:58:42 · 301 阅读 · 0 评论 -
centos下安装RabbitMq
rabbitmq需要erlang语言依赖。官网提供了两种安装方式。一种是通过使用yum资源包的形式,一种是手工依赖安装。Installing the package using Yum repositories on Package Cloud or Bintray (this option is highly recommended) Downloading the package and...原创 2018-11-12 11:49:41 · 160 阅读 · 0 评论 -
linux下用wget从官网下载jdk版本
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" 后面加复制的链接地址关键是红色部分。否则下载下来的文件是不无法安装的。只是html文件内容...原创 2018-11-12 15:52:54 · 548 阅读 · 0 评论 -
Sequences服务(分布式主键生成)
DefaultSequencepublic class DefaultSequence implements Sequence { private final Lock lock = new ReentrantLock(); private SequenceDao sequenceDao; /** * 序列名称 */ private S...原创 2019-01-07 14:43:39 · 1004 阅读 · 0 评论 -
IO模型(Java)
io模型本是UNIX网络编程相关的内容。UNIX中IO模型有五种,包括阻塞 I/O、非阻塞 I/O、I/O 复用、信号驱动式 I/O 、异步 I/O 等。 阻塞 I/O 模型阻塞式IO模型,一般表现为进程或线程等待某个条件,如果条件不满足,则一直等下去。条件满足,则进行下一步操作。如下图:非阻塞 I/O 模型非阻塞式IO模型:进程或线程目的未达到时,不再一味的等着,而是直接返回...原创 2018-12-29 15:08:35 · 160 阅读 · 0 评论 -
pinyin4j的使用工具类
pinyin4j是一个免费的开源框架,可以把中文(多音字,繁体字)转成拼音,是不是6到不行,而且还可以自定义输出格式等。 maven依赖<!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j --><dependency> <groupId>com.belerweb</gr...原创 2018-12-27 14:17:03 · 1119 阅读 · 0 评论 -
HttpServletRequest获取客户端IP(java小记)
小记这个简单的方法。/** * 获取客户端IP * * @param request * @return */private String getIpAddr(HttpServletRequest request) { String remoteAddr = request.getHeader("X-Forwarded-For"); if (StringUtil.i...原创 2018-12-27 13:49:32 · 1158 阅读 · 0 评论 -
Connection reset by peer 的IOException的异常
http客户端发起连接时经常会碰到Connection reset by peer 的IOException,这个异常是由jdk抛出来的。详细介绍下这个异常的发生说明了什么。1. 对于连接而言,首先区分三种连接种类一般连接主要分为长连接,短连接和http的keepalive连接。1.1 长连接:建立完连接后,该连接不再进行释放。 优点 性能较高,不需要重复建立tcp连接...原创 2018-12-27 10:20:44 · 3533 阅读 · 0 评论 -
ELK基础环境搭建Centos7.5
ELK版本:6.5.4Elasticsearch:wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.4.rpmLogstash:wget https://artifacts.elastic.co/downloads/logstash/logstash-6.5.4.rpmKiba...原创 2018-12-21 12:51:28 · 218 阅读 · 1 评论 -
JSR310 java8日期时间类型概念初探
Tiago Fernandez做过一次投票,选举最烂的JAVA API,排第一的EJB2.X,第二的就是日期API。原本的java日期API槽点太多,列举有:1.最开始的时候,Date既要承载日期信息,又要做日期之间的转换,还要做不同日期格式的显示,职责较繁杂,违背单一原则2.年份是从 1900 开始计算的而月份则从 0 开始3关键的问题是可变性。参public class ...原创 2018-11-30 16:26:36 · 297 阅读 · 0 评论 -
dubbo系列之一Multicast注册中心
不需要启动任何中心节点,只要广播地址一样,就可以互相发现 组播受网络结构限制,只适合小规模应用或开发阶段使用。组播地址段: 224.0.0.0 - 239.255.255.255。 提供方启动时广播自己的地址。 消费方启动时广播订阅请求。 提供方收到订阅请求时,单播自己的地址给订阅者,如果设置了unicast=false,则广播给订阅者。 消费方收到提供方地址时,连...原创 2018-12-04 17:27:16 · 3461 阅读 · 0 评论 -
java单例模式
饿汉模式:public class Singleton1 { private static Singleton1 singleton = new Singleton1(); private Singleton1(){ } public static Singleton1 getInstance(){ return singleton; }}这个会在Singleton1 类在加载时就创建实...原创 2018-07-09 14:43:36 · 115 阅读 · 0 评论