- 博客(123)
- 收藏
- 关注
原创 再见2019
又到了年底,写点总结就像给这一年的忙碌盖上个章也就完整了。一个人的成长从来都不是渐进式的,都是由一些突变的事情引出来。日常的琐碎事情很容易把我们掩埋的无声无息,走的太快却不知道留下什么,所以思考很重要。今年最大的收获来自陪伴亲人、旅行、读书。相比生活和工作的快节奏这些总能让你平静下来,平时遇到烦恼的问题甚至能在某乎上看到各种热评的,反而在读书的某个瞬间就能想明白。旅行和读书一样重要,有了旅行才...
2019-12-15 11:50:34
255
原创 spring自定义标签
如何将自定义的配置标签化是个比较通用的问题,spring已经很好的帮我们设计完成,只需要我们去实现。将繁琐的配置通过xml配置,spring自动转换成bean,整个过程比较合理。1.创建一个需要扩展的组件package com.bean;public class User { private String userName; private String email
2017-08-24 11:44:23
432
原创 基于servlet3实现长轮询
你可能有这样的需求:客户端需要持续访问服务端获取变化的数据,但是拉取变化的数据这个动作可能比较费时,所以并不能立刻返回结果。如果使用普通的同步请求客户端的连接会一直阻塞在服务端,服务端持有的连接也会越来越多,性能极差。短链接在请求耗时比较长的场景中效果很差,那用什么方式呢?长连接?长连接建立tcp三次握手后就会和服务器端一直保持连接直到服务端断开连接,但是连接状态会一直保存在web容器中。
2017-08-02 23:11:08
2098
1
原创 HttpClient发送请求时动态替换目标ip
问题描述:使用HttpClient进行http请求,每次请求随机使用一个target host进行请求。发http请求的时候,一般会配置数据源,设置ClientPNames.DEFAULT_HOST,这样在请求的时候目标机器host和端口就是配置的ClientPNames.DEFAULT_HOST。但是不能每次请求ClientPNames.DEFAULT_HOST,因为一个httpcl
2017-02-18 22:52:44
5342
原创 2017要来了
2016年就要过去啦,最后一天,简简单单做个了结。这一年自己还是有进步的,从我个人角度看从创业公司到一家大点的公司还是值得的,无论从业务还是使用到的技术还是不在一个层面。当面对的用户量变的很大时,有时候一个简单的问题都有可能掉坑里,所以代码的严谨程度和技术选型变得很重要。当然成熟的公司有时候技术可能会用一些老旧的东西,创业公司接触到的东西可能会新一些,各有各的考虑。成熟的公司更关注服务的稳定性
2016-12-31 12:32:57
1613
5
原创 Netty系列-客户端启动源码分析
客户端的示例代码package com.netty.server;import io.netty.bootstrap.Bootstrap;import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import io.netty.channel.*;import io.netty.channel.nio.NioEve
2016-12-18 22:55:38
703
原创 Netty系列-服务器端启动源码分析
之前写了几个Netty实现服务端和客户端交互的例子,现在通过分析源码看一下服务器端和客户端启动的整个流程。1.先看下服务器端启动的流程,如之前显示服务器时间的程序package com.netty.server;import io.netty.bootstrap.ServerBootstrap;import io.netty.buffer.ByteBuf;import io.nett
2016-12-18 11:31:11
684
原创 Netty系列-使用Google Protobuf编解码
什么是编解码通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输、数据持久化或者其它用途。反之,解码(Decode)/反序列化(deserialization)把从网络、磁盘等读取的字节数组还原成原始对象(通常是原始对象的拷贝),以方便后续的业务逻辑操作。进行远程跨进程服务调用时(例如RPC调用),需要使用特定的编
2016-12-12 23:54:58
3606
原创 Netty系列-TCP粘包拆包问题
还是之前的Netty输出服务端时间的例子,没有考虑TCP粘包拆包问题。LineBasedFrameDecoder和StringDecoder,这两个解码器就能解决粘包问题。
2016-12-08 23:29:32
651
原创 Netty系列-简单示例
还是实现发送命令到服务端获取时间的功能,这里是Netty实现。对比之前的java nio实现的方式,Netty封装的还是非常简洁。同时单纯的对比Netty的Server和Client也能看出有许多相似之处。
2016-12-05 23:36:08
698
原创 Netty系列-NIO入门
Netty封装了java的NIO实现了非阻塞NIO网络通信,大大提高了效率。为了更好的理解Netty中NIO的使用,还是需要对java的NIO回顾一下。从普通的socket网络通信到使用NIO的方式实现,还是有很大差别的。最关键的区别是处理IO的线程是否是阻塞的,在下面的分析中就可以看得出来。1)同步阻塞式的网络通信2)伪异步IO3)NIO实现以下的程序演示的是
2016-12-04 23:48:59
543
原创 java垃圾回收机制
深入理解java虚拟机是一本非常经典的书籍,每次阅读总能看到新的东西。当然最重要的是实践。在平时个工作过程中,我们很少有机会去调jvm启动参数所以可能对java垃圾回收的实践还是缺乏不少。理论很明白,没有实践操作还是不行的,等到线上有问题不可能直接跑到线上调试。所以平时自己写一些拿来调试分析的案例还是有必要。以下是书中的几段例子。1.java虚拟机垃圾回收使用的不是引用计数
2016-11-26 23:00:02
528
原创 cpu过高排查
线上服务器遇到某几台cpu占用过高的情况,一般会有这几个原因:- 线上服务器负载不均,导致cpu占用不同;- IO操作执行频繁,cpu一直等待;- 程序中出现死循环,线程一直运行;前两个可以通过查看监控排查,每台服务器的负载都是正常,qps相差不大,只有cpu相差较大,故排查第三种情况。1.top之后发现cpu占到30%左右找到java pid2
2016-11-19 10:26:45
497
原创 Java线程上下文类加载器与SPI
线程上下文类加载器(context class loader)是从JDK 1.2开始引入的。类 java.lang.Thread中的方法getContextClassLoader()和setContextClassLoader(ClassLoader cl)用来获取和设置线程的上下文类加载器。如果没有通过 setContextClassLoader(ClassLoader cl)方法进行设置的话,
2016-08-24 22:23:29
4321
原创 java SPI
什么是SPISPI的全名为Service Provider Interface.它是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具
2016-08-24 22:21:22
638
原创 java类加载器classloader
1.类加载器分类java类加载器层次结构如下:1)bootstrap classloader引导(也称为原始)类加载器,它负责加载Java的核心类。这个加载器的是非常特殊的,它不是 java.lang.ClassLoader的子类,而是由JVM自身实现的。加载的jar文件如下:file:/C:/Program%20Files/Java/jdk1.8.0_91/jre/lib/r
2016-08-22 16:48:19
496
原创 webx 容器初始化
webx扩展了spring的容器加载机制,首先在结构上扩展了component层,构造出不同应用模块bean之间的隔离机制。1.解析web.xml和spring web程序一样,容器的加载是通过在web.xml中配置的listener实现的。servlet容器在实例化servlet context的时候会触发contextInitialized方法从而开启实例化容器的流程。
2016-08-15 00:08:24
790
原创 solr实体嵌套、字段加权查询
创建索引时可能遇到实体嵌套的情况,比如学生信息中包含多个活动。在solr的data-config.xml中配置:<entity name="studentProfile" pk="ID" query="select CONCAT('studentProfile',studentProfileId) as solr_id,studentProfileId,nam
2016-02-27 10:12:18
5454
1
原创 java XSS防护
1.什么是XSS攻击xss表示Cross Site Scripting(跨站脚本攻击),xss攻击通过插入恶意脚本,实现对用户游览器的控制。比较常见的是利用xss攻击获取session id从而获取网站用户权限。2.如何防护这里介绍一种使用过滤器防护的方法。使用Filter对用户提交的数据进行过滤处理,去除恶意脚本。配置过滤器:public class XSSFilte
2015-12-13 22:32:15
928
原创 对接alipay支付遇到的问题
在支付宝支付接入过程中遇到几个需要注意和理解的地方,记录一下。相比微信支付,支付宝流程上感觉还是简单不少,网上和官方给的文档和demo还是很全的。在我的支付逻辑中包括:发起支付请求、用户支付、支付通知(支付成功后自动发货)、订单状态更新。以下是几个问题:1).支付完成后同步通知和异步通知区别,有问题就要去好好看看支付宝文档(https://cshall.alipay.com/support
2015-11-21 22:37:49
8019
原创 nginx+tomcat集群高可用
需求是这样的:比如一个 tomcat 节点 down 掉,其他节点能够替换它。使用nginx的第三方插件nginx_upstream_check_modulehttps://github.com/yaoweibin/nginx_upstream_check_module我的测试环境是:nginx/1.7.2 + tomcat71.首先下载nginx_upst
2015-11-11 21:50:53
2383
原创 hibernate session相关类的几个问题
1. SessionFactory从SessionFactory中获取session后需要手动关闭session,显示调用session.close方法;或者交给spring维护,详细配置如下:在 web.xml 文件里面加上下面的配置信息 osivFilter org.springframework
2015-10-16 13:27:16
618
原创 requireJS参数传递
1.传递参数到方法require(['scripts/app/world'], function(app){ //1.传递参数到方法 app.setName('World'); app.sayName(); });在world.js中:define(function(){
2015-10-16 09:51:19
7620
原创 mongo两级数组嵌套数据更新问题
mongo中存储文档数据时数据存储的格式为二维数组嵌套,这时想修改数组元素的子元素时就要维护两级索引号才能进行更新操作。例如:{ "_id" : ObjectId("55de9cf9c8b9d5dd58ba2d10"), "wordTask" : { "childTasks" : [{ "bookId" : 2, "bookName" : "
2015-08-30 17:14:11
3827
原创 mongodb和spring整合
mongo使用有一段时间了,感觉有不少坑,以后在使用时还是要权衡搞清楚利弊才好。mongodb中时间的存储、聚合查询的效率等等还是要多注意。使用mongo首先要面临的是文档对象转换问题,如果是使用spring data mongodb框架的话框架已经给你解决不必担心,但是如果使用原生的mongo各语言版本驱动去开发的话还是要自己去封装。下面是用java的mongodb驱动去做的。1.首
2015-08-30 16:42:54
842
原创 tomcat使用redis存储共享session
在tomcat集群环境下实现session共享有几种解决方案,这里介绍一种简单的方案。使用redis对session进行存储,配置比较简单。web服务器是tomcat61.下载jar包:commons-pool-1.6.jarjedis-2.1.0.jartomcat-redis-session-manager-tomcat6.jar2.修改tomcat/conf目
2015-06-11 22:55:24
1133
原创 akka入门-远程调用
akka远程调用有两种形式:一种是查找远程Actors,一种是创建远程Actors。公用的类:import java.io.Serializable;public class Op { public interface MathOp extends Serializable { } public interface MathResult extends Serial
2015-05-25 23:52:39
4043
1
原创 crontab定时任务
基本格式 :* * * * * command分 时 日 月 周 命令第1列表示分钟1~59 每分钟用*或者 */1表示第2列表示小时1~23(0表示0点)第3列表示日期1~31第4列表示月份1~12第5列标识号星期0~6(0表示星期天)第6列要运行的命令我的需求是定时备份mongodb:编写任务执行的脚本backup_mongodb_
2015-05-22 16:07:54
662
原创 akka入门-消息派发器
Akka MessageDispatcher是维持Akka Actor “运作”的部分, 可以说它是整个机器的引擎。在没有为 Actor作配置的情况下,一个 ActorSystem 将有一个缺省的派发器。 缺省派发器是可配置的,缺省情况下是一个使用“fork-join-executor”的 Dispatcher , 在大多数情况下拥有非常好的性能。1.为 Actor 指定派发器在app
2015-05-20 17:12:11
1653
原创 akka入门-热插拔(become和unbecome)
Akka支持在运行时对角色消息循环 (例如它的的实现)进行实时替换: 在角色中调用getContext.become 方法。 热替换的代码被存在一个栈中,可以被pushed(replacing 或 adding 在顶部)和popped。become一个特别好的例子是用它来实现一个有限状态机。使用Become/Unbecome特性还可以很方便的实现状态转换机。1.动态替换方法im
2015-05-18 22:52:40
2654
原创 akka入门-Futures
在 Akka 中, 一个 Future 是用来获取某个并发操作的结果的数据结构。 这个操作通常是由 Actor 执行或由 Dispatcher 直接执行的. 这个结果可以是同步(阻塞)或异步(非阻塞)的方式访问。其中有执行上下文ExecutionContext。为了运行回调和操作, Futures 需要有一个 ExecutionContext, 它与 java.util.concurren
2015-05-17 21:39:41
1126
原创 akka入门-定时器
使用定时器可以实现将来发生的事情进行计划执行。以下代码演示了过一段时间向Actor发送消息。1.编写Actor在Actor中只是打印出接收到的消息import akka.actor.UntypedActor;import akka.event.Logging;import akka.event.LoggingAdapter;public class TestActor ex
2015-05-17 21:37:36
6271
原创 akka入门-有类型的Actor
Akka 中的有类型 Actor 是 Active Objects 模式的一种实现. Smalltalk诞生之时,就已经缺省地将方法调用从同步操作发为异步派发。有类型 Actor 由两 “部分”组成, 一个公开的接口和一个实现。对普通actor来说,你拥有一个外部API (公开接口的实例) 来将方法调用异步地委托给其实现的私有实例。有类型Actor相对于普通Actor的优势在于有类
2015-05-17 21:34:33
1388
原创 akka入门-事件总线
事件总线就是总线上有各种事件和不同订阅者,订阅者可以绑定不同的事件,总线上有事件接收到时会将消息发布到该消息的所有订阅者中。1.编写事件发送Actorimport akka.actor.UntypedActor;import akka.event.Logging;import akka.event.LoggingAdapter;import com.center.akka.si
2015-05-17 21:33:00
2132
原创 akka入门-基于信道进行消息可靠传输
程序的演示场景是:处理器发送命令,接收者接收到消息后进行处理并且对发送方发送消息确认表明已经成功收到消息。如果没有发送确认则表明该消息没有被接收并正确处理。失败消息会到达死信箱,系统下次启动时后继续发送死信箱中的发送失败的消息。1.创建信道回复命令对象import com.center.akka.simple.command.Command;public class Channel
2015-05-17 21:28:47
1776
原创 akka入门-对处理器状态进行持久化
该话题涉及几个概念:处理器、信道、事件源、日志、状态。消息可以持久化,通常当前的状态保存在内存中(内存镜像),而事件源机制可以通过重播接收到的消息(在应用程序正常启动或崩溃后)恢复当前(或历史)的状态。Eventsourced 实现了预写日志(write-ahead log ,WAL)用于跟踪一个Actor 所接收消息,并通过回放记录的消息来恢复其状态。处理
2015-05-17 21:24:56
1784
原创 akka入门-调用子Actor处理消息
程序演示了父子结构的Actor处理消息。父Actor接收到消息后调用子Actor处理。1.创建父子Actorimport java.util.UUID;import com.center.akka.simple.command.Command;import com.center.akka.simple.event.Event;import akka.actor.ActorRef;
2015-05-17 21:21:09
4015
原创 akka入门-简单示例
以下程序演示了akka的一个简单的示例。创建Actor去处理一条命令,通过消息传递的方式进行交互。我使用的akka版本和相关jar包参见pom文件:<project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schema
2015-05-17 21:09:09
4290
原创 akka入门-简介
为什么使用akka akka是Actor模型的实现。Actors为我们提供了以下优点:1)对并发/并行程序的简单的、高级别的抽象。2)异步、非阻塞、高性能的事件驱动编程模型。3)非常轻量的事件驱动处理。akka提供了容错性使用“let-it-crash”语义和监管者树形结构来实现容错。非常适合编写永不停机、自愈合的高容错系统。监管者树形结构可以跨
2015-05-17 21:04:27
1444
原创 vagrant+VirtualBox配置linux环境
1.下载VirtualBox-4.3.26-98988-Win.exe和vagrant_1.7.2.msi以及镜像lucid64.box该镜像是Ubuntu lucid 642.VirtualBox-4.3.26-98988-Win.exe和vagrant_1.7.2.msi按步骤进行安装即可3.在命令行中输入vagrant出现帮助信息安装成功。4.添加
2015-05-09 15:56:38
1465
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人