自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

pentiumchen的专栏

混迹在猪厂的超级大码农

  • 博客(50)
  • 资源 (8)
  • 收藏
  • 关注

原创 单元测试引入hsqldb探索

为了提高代码和产品质量,我们网站的大部分产品都接入了单测平台,任何任务在提测前都要执行整个提测工程的单元测试,测试结果全部通过并且覆盖率统计等指标达标之后才能通过提测申请。这当然对于提高产品代码质量是有非常大的好处的,有助于识别代码中的bug。但是在执行的过程中可不是那么顺利的,主要体现在有时单测执行失败并不是代码有什么bug,而是单测依赖的数据发生了变化导致单测的执行结果和预期的结果不一样ass...

2018-11-07 17:21:00 1040

原创 一个传递依赖导致的应用崩溃

问题最近我们有个应用合并了一个任务的代码之后应用无法启动,报下面的错误:Caused by: java.lang.NoSuchMethodError: org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.modulesToInstall([Lcom/fasterxml/jackson/databind/Mo...

2018-09-28 16:21:55 952

原创 nginx健康检查导致的问题

最近有次web应用版本上线,出现了一个可怕的事情,上线之后所有http请求都报502,但是之前在测试环境和预发布环境测试功能是没有任何问题的。 502错误说明是tomcat应用出问题了,查看tomcat启动日志,没有任何异常,日志显示应用已经正常启动成功了,ssh连上服务器,通过wget调用接口发现是可以正常响应的,这就更说明了tomcat应用本身是没问题的。但是查看应用的localhost_a...

2018-03-02 16:23:30 5563

原创 dubbo框架中一行日志代码引发的超时问题

前一段时间有测试反馈,我负责的一个dubbo接口调用超时,而是是稳定必现的超时。拿到问题之后第一件事当然是分析代码所有可能性能瓶颈的地方,然后并没有收获,我们的接口超时时间设置的是5s,然后单测我们的接口时间只有几十ms。相同的数据,测试怎么会出现这么大的差异呢。难道是dubbo接口的配置问题?找我们的dubbo老司机检查了一遍并没有检查出配置问题,而且工程日志也出现任何可疑的错误信息。而且换了几个

2016-12-05 09:42:24 4032

原创 Spring框架由ConditionalOnMissingBean注解引发的问题

问题描述最新负责的工程在做dubbo配置disconf静态配置托管优化,由一个StaticConfigPropertiesFactoryBean来读取静态配置,它是PropertiesFactoryBean的一个子类,读取到的所有配置放在一个Properties中。 dubbo配置直接引用这个Properties的值。像下面这样,dubbo接口的group通过disconf的静态配置项dubb

2016-12-02 19:00:13 55798 7

原创 dubbo源码浅析(五)-远程服务调用流程

消费端调用远程服务接口时,使用上和调用普通的java接口是没有任何区别,但是服务消费者和提供者是跨JVM和主机的,客户端如何封装请求让服务端理解请求并且解析服务端返回的接口调用结果,服务端如何解析客户端的请求并且向客户端返回调用结果,这些框架是如何实现的,下面就来看下这部分的代码。 消费端调用提供端服务的过程要执行下面几个步骤: 1. 消费端触发请求 2. 消费端请求编码 3.

2016-11-29 09:27:05 19326 10

原创 dubbo源码浅析(四)-服务消费者初始化

在分析标签解析的时候知道框架会把dubbo:reference解析成一个ReferenceBean,它是一个FactoryBean,消费者的初始化在它的init方法中执行,这个方法在两种情况下会被调用: 1. 消费者设置了立即初始化(init属性设置成true),那么bean加载时会立刻调用消费者初始化。 2. 消费者bean被使用者调用时,调用getObject->get->init

2016-11-28 11:58:42 4255

原创 dubbo源码浅析(三)-服务提供者初始化

dubbo服务提供者由dubbo:service来定义,从前面可以看到,Spring把dubbo:service解析成一个ServiceBean,ServiceBean实现了ApplicationListener和InitializingBean接口,ServiceBean有个核心方法export,在这个方法中初始化服务提供者并且暴露远程服务。这个方法在bean初始化或容器中所有bean刷新完毕时

2016-11-26 11:23:54 4397

原创 dubbo源码浅析(二)-标签解析

前面了解了dubbo的插件化机制之后,接下来进入正题,研究一下dubbo的核心原理,由于dubbo的功能配置较多,为了更高效的研读代码,在阅读的过程中尽量忽略一些细节,重点关注它的主干流程,主干了解清楚之后再去分析它的一些细节功能就更轻松了,否则容易陷入各种细枝末节不能自拔让整个代码的阅读周期变得冗长无比效率大打折扣。 Dubbo框架中,服务提供者和服务消费是两个核心角色,所以主要通过服务提供者

2016-11-25 19:45:08 3497 3

原创 dubbo源码浅析(一)-插件化机制

在前东家一直从事偏客户端相关的工作,进了新东家之后终于有机会从事大型的分布式系统开发,在微服务大行其道的今天,dubbo框架作为一款优秀的开源RPC框架使用非常广泛,在使用dubbo的这几个月里,用零碎的空闲时间对dubbo框架的源码浅读了一番,由于平时工作忙加班比较多,所有历时几个月才把读代码的过程整理出来,打算分成几篇把这个过程共享记录下来。

2016-11-19 10:15:24 5211 1

原创 Netty内存池原理分析

为了避免频繁的内存分配给系统带来负担以及GC对系统性能带来波动,Netty4提出了全新的内存管理,使用了全新的内存池来管理内存的分配和回收。内存池这块的代码晦涩难懂,而且几乎没有注释,所以阅读起来比较费力,特别是以前没有接触过内存分配算法的阅读起来更为蛋疼,好在经过几个晚上的努力,终于捋出了一些端倪,特来此记录一番。Netty4的内存池集大家之精华,参考了各路英雄豪杰的优秀思想,它参考了sla

2015-04-29 22:13:08 24517 5

原创 Netty为啥可靠(三)

连接中断处理在客户端和服务端建立起连接之后,如果连接发生了意外中断,Netty也会及时释放连接句柄资源(因为TCP是全双工协议,通信双方都需要关闭和释放Socket句柄才不会发生句柄的泄漏,如不经过特殊处理是会发生句柄泄露的),原理如下:在读取数据时会调用io.netty.buffer.AbstractByteBuf.writeBytes(ScatteringByteChannel, in

2015-04-19 21:56:56 5037

原创 Netty为啥可靠(二)

Selector空轮询处理在NIO中通过Selector的轮询当前是否有IO事件,根据JDK NIO api描述,Selector的select方法会一直阻塞,直到IO事件达到或超时,但是在Linux平台上这里有时会出现问题,在某些场景下select方法会直接返回,即使没有超时并且也没有IO事件到达,这就是著名的epoll bug,这是一个比较严重的bug,它会导致线程陷入死循环,会让CPU飙

2015-04-18 22:14:17 5619 1

原创 Netty为啥可靠(一)

NIO闲聊自从JAVA1.4推出NIO起,JAVA网络编程进入了一个全新的时代,传统网络IO(OIO)是傻等式的,一旦IO操作发起,那么用户线程就陷入很傻很天真的等待中,直到IO操作结束或者发生了断连,而NIO则要聪明许多是事件触发式的,只有当前有IO事件发生了,才会通知用户线程执行IO操作,当前操作结束之后不会阻塞等待可以执行其他的业务操作等待下一次事件,就好比上银行取钱,一种方式排队傻等直

2015-04-17 22:18:33 3999

原创 基于Netty的Redis客户端-Nedis

最近温习了一遍Redis命令,忧伤的是很多东西已交还给老师,正好赶上antirez大神在愚人节发布了Redis 3.0,Redis终于有了支持集群的正式版本,于是心血来潮决定自己实现一个Redis客户端来抚慰我这颗忧伤的心灵。Jedis已经足够强大,它的网络连接是基于阻塞式IO,实现非常简单易懂,但是OIO和NIO相比性能上有劣势,于是决定通过NIO来实现和Redis服务器的网络连接,现在

2015-04-16 21:57:56 5435 3

原创 《Redis设计与实现》学习笔记-Lua脚本

Redis从2.6开始支持Lua脚本,和事务的功能类似,可以通过Lua脚本原子的执行多个Redis命令。Redis提供了EVAL和EVALSHA命令执行lua脚本。创建并修改Lua坏境Redis在服务器内嵌了一个Lua坏境,并进行了一系列的修改,从而确保这个Lua坏境可以满足Redis服务器的需要,通过下列步骤创建并修改Lua坏境:创建一个基础Lua坏境,通过调用Lua的C API

2015-03-21 21:55:29 1033

原创 《Redis设计与实现》学习笔记-发布订阅与事务

发布与订阅Redis通过发布订阅提供一对多甚至是多对多的节点消息通信,发布订阅由PUBLISH、SUBSCRIBE、PSUBSCRIBE、PUBSUB等命令组成。SUBSCRIBE命令:订阅某频道,在redisServer结构中通过pubsub_channels字典属性保存当前服务器所有频道的订阅关系,字典键时频道名称,字典值是一个链表,记录了所有订阅这个频道的客户端。UNSUBSCR

2015-03-21 21:39:40 794

原创 《Redis设计与实现》学习笔记-集群

Redis也可通过集群来实现分布式,通过分片进行数据共享,并提供复制和故障转移。当前Redis版本的集群功能还没有正式发布,目前只是一个不稳定的分支,据说快要正式发布了。添加集群节点服务器节点通过执行CLUSTER MEET 命令把指定的服务器添加到当前集群中,通过CLUSTER NODES来查询当前集群中的所有节点信息,当cluster-enabled配置选项设成yes时,说明该服务器

2015-03-21 20:43:26 1378

原创 《Redis设计与实现》学习笔记-Sentinel(哨岗、哨兵)

Sentinel是Redis的高可用性解决方案,由一个或多个Sentinel实例组成Sentinel系统,可以用来监视任意多个主服务器和主服务器下的所有从服务器,当监视到主服务器下线之后会自动将下线主服务器下的从服务器升级为新的主服务器,由新主服务器代替已下线主服务器处理命令请求。Sentinel是一个特殊的Redis服务器实例,Redis由一个或多个Sentinel实例构成Sentinel系

2015-03-20 23:59:10 1371

原创 百度云推送消息到达率低问题定位分析

去年做我们这个产品的时候,SE在客户端设计了一个推送功能,经过SE的调研,决定在Android和IOS端都集成百度的云推送SDK来支持这个推送功能。最近领导在做运营分析的时候,发现云推送的报表显示,在Android端消息的达到率非常低,设备的在线率波动比较大,有时高有时非常低。我们的这个产品经过将近两年的折腾进步是有目共睹的,在今年的巴塞罗那GSMA世界移动通信大会上荣获“Best Mobil

2015-03-20 20:32:12 6755 3

原创 《Redis设计与实现》学习笔记-主从复制

为了提供整个缓存的可用性,可以给主服务器添加备用服务器,即从服务器。通过SLAVEOF命令把当前服务器设置成某台服务器的从服务器。老版本同步过程旧版本(2.8之前)主从服务器数据同步过程如下:从服务器向主服务器发送SYNC命令。主服务器接收到SYNC命令后调用BGSAVE命令生成一个RDB文件,在此过程中客户端对主服务器的修改命令存放在一个缓冲区中。主服务器把生成的RDB文件发

2015-03-19 23:41:25 772

原创 《Redis设计与实现》学习笔记-服务端

Redis服务器负责与多个客户端建立连接,处理客户端请求,保存各个数据库状态。通过使用由I/O多路复用技术实现的事件处理器,Redis服务器采用单线程单进程处理客户端命令请求。Redis通过redisServer结构来记录服务端的各种状态。命令请求执行过程1、客户端发送命令请求,客户端将命令请求转换成协议格式。2、服务端读取命令请求,将命令请求缓存在客户端输入缓冲区中,对输入缓冲区中的

2015-03-19 23:18:16 845

原创 《Redis设计与实现》学习笔记-客户端

Redis通过一个redisClient结构体来保存客户端当前的状态信息和执行相关功能时需要用到的数据结构,包括:套接字描述符名字flags属性输入缓冲区输出缓冲区当前要执行的命令与命令参数身份验证标识时间套接字描述符 fd属性保存客户端正在使用的套接字描述符。如果客户端是伪客户端该属性值为-1,如果是普通客户端它是一个大于-1的整数。redis在加载AOF文件或执行Lua

2015-03-18 23:18:10 1047

原创 《Redis设计与实现》学习笔记-持久化机制

同memcached(对不起,又躺枪了)等完全基于内存的缓存相比,Redis是提供了持久化功能的,这也是为什么在某些条件下Redis可以用来做存储而不仅仅是缓存,节点down机之后可以通过持久化的数据还原某个时间点的状态。Redis提供了两种持久化机制RDB和AOF,准确的讲应该是三种,Redis提供了虚拟内存机制,但是据说性能非常不靠谱,嗯,是据说,我并没有深入研究过。RDB持久化RDB

2015-03-17 22:59:38 761

原创 《Redis设计与实现》学习笔记-单机数据库

一个Redis服务器实例在单机运行时可以添加多个数据库来保存键值对,Redis在实现中通过一个redisDb结构体来描述数据库,该结构体中有一个字典类型的字段来保存数据库中所有的键值对,redisServer结构体来描述服务器实例,该结构体中有一个dbnum字段来保存数据库数量,一个redisDb数组字段来保存服务器中的所有数据库。struct redisServer{ ...

2015-03-17 22:09:49 796

原创 《Redis设计与实现》学习笔记-基础数据结构

和memcached相比,redis提供更丰富的数据结构

2015-03-16 22:02:56 944

原创 spring属性占位符

在bean定义时设置bean属性的值时,除了设置固定的值,还可以通过EL表达式和占位符来设置,容器在解析bean定义时会对EL表达式和占位符进行解析求值。本篇来学习一下通过占位符定义属性的用法。占位符的取值范围有三个:系统变量(System.getProperty)、坏境变量(System.getEnv)、自定义的Properties文件。Spring提供了三种方式来配置加载自定义的pro

2015-03-15 21:54:38 7452 2

原创 Spring properties定义bean

Spring提供了丰富的标签和注解来进行bean的定义,除此之外框架来提供了扩展机制让使用可以通过properties来定义bean,与强大的标签式和注解式的bean定义相比,properties提供的规则要简单许多。key部分用.分隔即通过A.B来进行相关的属性定义,其中A表示bean名称,B通过不同的值还表达不同的含义:(class),bean的类型(parent),bean的

2015-03-15 17:27:04 2434

原创 Spring AOP实现原理

在Spring AOP框架中学习了动态AOP的几种实现方式,本篇重点来学习一下动态AOP的实现原理。Spring AOP是利用代理模式,在运行时生成一个目标对象的代理,并且使用代理代替目标对象,整个过程对使用者透明,使用者无法像使用目标对象一样使用代理对象,代理对象类型是目标对象所属类的子类或者接口实现,这个子类也是在运行时动态生成,这个生成子类的过程使用操作字节码技术,Spring框架中使用

2015-03-11 23:22:52 6135

原创 Spring AOP框架使用

在Spring AspectJ LTW中分析如果在类加载期织入切面,本篇中学习如何在运行时动态的注入切面,这种方式在实际项目中使用比较多,在Spring AOP框架中提供了三种方式在程序运行时注入切面:ProxyBeanFactoryaop名称空间的标签Aspect注解下面通过几个简单的例子演示如何通过这几种方式来织入切面。ProxyBeanFactory这个例子非常简

2015-03-08 20:36:45 1321

原创 Spring AspectJ LTW

LTW(Load Time Weaver),即加载期切面织入,是ApsectJ切面织入的一种方式,它通过JVM代理在类加载期替换字节码到达织入切面的目的。下面通过一个简单的例子来演示怎么使用LTW,然后从代码入手分析LTW的实现原理。简单的实例首先定义个切面类,该切面功能非常简单,就是在spring.beans.ltw及其所有子包下所有的类的方法调用前后各添加一行begin和end日志,使

2015-03-06 23:28:33 4670 1

原创 AOP框架简介

AOP:面向切面编程,是一种设计理念,并非Spring特有。AOP由于把

2015-03-05 23:15:13 1307

原创 Spring conversion框架

框架简介在Spring PropertyEditor分析中介绍了如果通过PropertyEditor来进行值转换,已经如何根据自身的需求自定义PropertyEditor,但是Spring的这套处理框架存在几个问题:方法参数是弱类型,需要编写一些类型转化代码,对使用者不友好PropertyEditor是有状态的,如果共享实例在高并发条件下会有性能隐患,所以在对bean进行初始化是需

2015-03-04 21:18:47 3943 4

原创 Spring PropertyEditor分析

通过xml解析器解析出bean定义之后,bean定义的所有属性都是字符串类型的,

2015-03-02 23:50:58 4937

原创 Spring bean的作用域

Spring IOC容器中,默认的bean作用域有两种:singleton,这种作用域的bean一旦创建后bean的生命周期和容器同步,只有容器关闭时才会销毁这种bean,相同id的bean在容器的生命周期内只会被实例化一次,通过相同的id向容器请求时会返回相同的实例prototype,这种作用域的bean不会交给容器托管,创建之后不会注册到容器,它的生老病死完全由应用层决定,每次通过

2015-03-01 22:17:37 1243

原创 Spring IOC容器bean初始化源码分析

上一篇分析对bean定义的解析源码进行了分析,这个过程的最终结果是把xml文件中bean的定义解析成一个个的BeanDefinition对象并且注册到容器中,在Spring IOC容器启动简介篇中分析,在容器启动的最后会对容器中的所有bean进行初始化,利用之前解析出的BeanDefinition对象,创建一个个最终的bean对象,并且完成bean之间的依赖注入,本篇从源码的角度分析在容器启动时所

2015-02-25 20:59:01 4373 2

原创 Spring bean定义解析源码分析

在上一篇Spring IOC容器启动简介中在ClassPathXmlApplicationContext的基础粗略的分析了IOC容器的启动过程,对一些比较复杂的步骤没有详细的说明,从本篇开始对其中的一些比较复杂的步骤进行分析。本篇对基于ClassPathXmlApplicationContext的IOC容器的bean定义的解析与加载过程进行分析。bean定义解析加载的简单时序图如下:b

2015-02-24 21:13:36 2933

原创 Spring IOC容器启动简介

BeanFactory和ApplicationContext都可以用来作为Bean工厂负责创建和管理Bean,相比之下ApplicationContext是BeanFactory的一个增强升级版,比如Application提供了强大的事件机制,自动加载BeanPostProcessor和BeanFactoryPostProcessor,预创建Bean等,一般情况下都使用ApplicationCon

2015-02-18 14:34:56 2816

原创 Disruptor原理浅析

Disruptor是一个高吞吐量的异步处理框架,LMAX号称用它可以1秒钟处理600万订单,从一个简单的例子来分析Disruptor,下面的代码是基于2.10.4版本,不同的版本API有些变化,代码仅供参考。private static void testDisruptor() { RingBuffer ringBuffer = new RingBuffer( new EventFacto

2015-02-16 20:51:37 2477

原创 乱弹java并发(九)-- fork/join

ForkJoin是在java7引入的由Doug Lea设计的一个并行计算框架,ForkJoin框架包含两部分:1、把任务Fork成一系列的相互之间无依赖的递归子任务,不同的子任务可以由不同的CPU核心执行;2、合并(Join)子任务的执行结果。Doug Lea在ForkJoin中引入一个叫work steal的算法,即当某线程的任务队列已执行完时,可以扫描其它线程的任务队列,从其它线程的任务队列队

2015-02-15 00:58:25 654

Android SQLite ORM框架

一个简单的Android SQLite ORM框架不想花资源分的同学可以上我的github主页下载:https://github.com/chenyihan/Simple-SQLite-ORM-Android,因为要传到github,所以代码中的注释和doc文档都是英文的,对自己英文不自信的同学可以求助百度翻译^_^

2015-02-06

Spring技术内幕

阐述了Spring的设计原理和工作原理,非常不错,希望对Spring原理有了解的可以下一下

2014-06-29

spring3.2.9源码

spring3.2.9的jar包,包含源代码

2014-06-29

jmx api规范

是一个用于管理和监视的标准 API。典型用途包括: 查询并更改应用程序配置 累积有关应用程序行为的统计数据并使其可用 通知状态更改及错误状况。 附件里面是jmx相关的规范,以及相关的api帮助文档

2012-09-27

xmlbeans 源码

xmlbeans是apache提供的用于在xml和java POJO之间相互转换的工具,附件中是相关的源代码,有兴趣的同学欢迎下载

2012-09-27

apache xmlbeans2.6

apache提供的技术,主要功能是在xml文档和POJO对象之间进行可逆的转换,类似于Java的jaxb标准,大家赶紧下吧

2012-09-27

proxool-0.9.jar

proxool 0.9大家赶紧下吧,跟tomcat5.0兼容,能够替代Hibernate的连接池

2009-03-25

jsf1.2 source code

jsf1.2得源代码,包括jsf-api,jsf-ri,jsf-tools,jsf-doc等等。。。

2008-10-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除