- 博客(37)
- 资源 (2)
- 收藏
- 关注
原创 使用druid数据源,由于网络问题导致oracle SocketInputStream.socketRead0堵塞解决办法
线上Oracle数据库网络非常不稳定,不时发生连接闪断,发现一个线程一直堵塞,日志没有错误。dump出线程信息后如下:pool-4-thread-50" prio=10 tid=0x00007f92f5251000 nid=0x26e1 runnable [0x00007f929a1df000] java.lang.Thread.State: RUNNABLEat java.n
2018-03-20 11:04:53
8637
1
原创 Netty NIO 源码分析
首先我们写一个单线程的代码模型:package com.zhp.springbootstreamdemo.net;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import j
2018-01-25 17:43:07
426
原创 spring 多数据源手动管理事务,最大程度保障数据一致性
模板代码如下: @Autowired private DataSourceTransactionManager transactionManager; public void insert(CardEntity card, String dataSourceCloud, String tableNo) { TransactionStatus status
2018-01-10 16:13:45
4133
1
原创 maven 打jar包的时候把依赖的包一起打包
maven-assembly-plugin false src/assembly/assembly-fat-jar.xml make-assembly package a
2017-12-28 11:17:11
1676
原创 aop:aspectj-autoproxy 标签解析
1.标签解析对应的handlerhttp\://www.springframework.org/schema/aop=org.springframework.aop.config.AopNamespaceHandler对应的解析类如下registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanD
2017-12-06 14:19:36
3965
原创 使用jstack查看当前进程全部线程的状态
1.使用jps 命令找到进程的PID$ jps225648 Jps5268127284 Launcher226980 Launcher227624 ConcurrencyTest2.使用jstack命令dump出线程信息jstack 227624 > ./thread.dump3.分析线程的状态信息$ grep java.lang.T
2017-11-28 17:03:32
10952
翻译 空闲连接检查以及超时的ChannelHandler
IdleStateHandler:当连接空闲时间太长时,将会触发一个IdleStateEvent事件。然后你可以通过在你的ChannlInboundHandler中重写userEventTriggered()方法来处理该IdleStateEvent事件。ReadTimeoutHandler:如果在指定时间间隔内没有收到任何的入站数据,则抛出一个ReadTimeoutException并关闭
2017-11-28 14:22:34
1421
翻译 Netty websocket 实现服务端推送消息
当握手完成时,将channel加入到ChannelGroup中,当发生异常或失活的时候,将channel从ChannelGroup中移除。ChannelGroup维护着所有活动着的链接,使用ChannelGroup向所有Channel推送消息。package netty.pushmsg;import io.netty.channel.ChannelHandlerContext;
2017-11-28 11:02:31
7464
1
原创 spring boot websocket
1.消息广播/** * 广播模式 */@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketBroadcastConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void registerS
2017-11-23 16:27:58
815
原创 kafka producer 发送消息
package com.zhp.springbootstreamdemo.kafka;import org.apache.kafka.clients.producer.Callback;import org.apache.kafka.clients.producer.KafkaProducer;import org.apache.kafka.clients.producer.Produce
2017-11-21 16:01:04
12696
1
原创 redis实现访问限制
package redis;import redis.clients.jedis.HostAndPort;import redis.clients.jedis.JedisCluster;import java.util.Arrays;import java.util.HashSet;import java.util.Set;public class RedisLimit {
2017-11-20 15:08:37
2214
1
原创 context:annotation-config 标签解析
激活@Required,@Autowired, @PostConstruct, @PreDestroy, @Resource, @PersistenceContext ,@PersistenceUnit注解registerBeanDefinitionParser("annotation-config", new AnnotationConfigBeanDefinitionParser())
2017-11-14 11:16:19
1038
原创 context:component-scan 标签解析
1.作用扫描classpath下带有注解的类,注册成spring bean。Spring 默认提供的注解包括@Component,@Repository,@Service,@Controller,@RestController,@ControllerAdvice, @Configuration。它有一个annotation-config属性默认是ture,它的作用和 一样。激活@R
2017-11-14 10:18:09
4031
原创 Netty 需要注意的细节
SimpleChannelInboundHandler 实现了channelRead 方法,使用了模版模式,最后有一个释放资源的动作。@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { boolean release = true; try {
2017-11-03 11:14:51
512
原创 @Sharable 注解作用
@Sharable 注解用来说明ChannelHandler是否可以在多个channel直接共享使用。下面我们做一个实验。1.Channel共享ChannelHandler对象。但是这个ChannelHandler没有添加@Sharable注解public static void start() throws InterruptedException { final Ech
2017-11-03 09:55:11
23886
原创 context:property-placeholder 标签解析
context:property-placeholder location="classpath*:application.properties"/>对应的handlerhttp\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandlerpubl
2017-11-02 09:30:08
728
原创 Spring 事务管理
1.配置解析tx:annotation-driven transaction-manager="transactionManagerMember" order="2"/>我们需要找到这个标签解析的handler,在spring-tx jar包下META-INF目录下spring.handlers文件中找到如下:http\://www.springframework.org/
2017-11-01 09:24:42
282
原创 Netty 时间轮算法实现HashedWheelTimer
1.HashedWheelTimer 参数解析public HashedWheelTimer( ThreadFactory threadFactory, long tickDuration, TimeUnit unit, int ticksPerWheel, boolean leakDetection, long maxPendingTime
2017-10-30 14:19:31
7365
原创 Spring web环境容器启动流程
1.初始化入口 org.springframework.web.context.ContextLoaderListenerpublic class ContextLoaderListener extends ContextLoader implements ServletContextListener 通过实现ServletContextListener 在ServletCo
2017-10-30 09:28:55
1310
原创 ClassPathXmlApplicationContext 初始化流程
1.configLocations的解析构造器代码如下:super(parent);setConfigLocations(configLocations);if (refresh) { refresh();}我们先看setConfigLocations代码this.configLocations = new String[locations.length];
2017-10-26 14:38:39
2221
原创 消息驱动:Spring Cloud Stream
1.stream 配置中的含义当我们使用默认group,和destination时默认创建名为input 的topic类型的exchangespring.cloud.stream.bindings.input.group=queueNamespring.cloud.stream.bindings.input.destination=exchangeName
2017-10-20 15:11:09
10794
5
原创 Spring Boot 配置文件和日志文件放到jar之外
1.设置打包jar的时候排除文件 src/main/resources *.properties logback.xml 2.启动的时候传入参数指定位置java -jar xxx.jar --spring.config.location=D:\springco
2017-10-19 15:24:26
11561
转载 Mybatis级联查询和缓存
1.表结构create table t_lecture( id int(20) not null auto_increment comment '编号', lecture_name varchar(60) not null comment '课程名', note varchar(1024) comment '备注', primary key (id));crea
2017-10-16 15:27:10
553
原创 Oracle批量插入
1.批量插入sql语法insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE) select 8000,0,'Multi 8000',1 from dualunion all select 8001,0,'Multi 8001',1 from dual或者INSERT ALL INTO t
2017-10-12 14:53:49
504
原创 Spring 循环依赖
1、两个都是prototype的bean 两个bean都是prototype,只有在使用的时候才去创建bean。 AbstractBeanFactory类中doGetBean方法检测循环依赖。// Fail if we're already creating this bean instance:// We're assumably within a circular refer
2017-10-12 09:17:24
428
原创 配置中心:Spring Cloud Config
1.Spring Cloud Config 服务端(基于git)1.1添加依赖 org.springframework.cloud spring-cloud-config-server1.2配置#spring.cloud.config.server.git.uri=file:///${user.home}/config-repo 本地调试用spring.
2017-10-10 16:45:56
451
原创 理解JSONP
1.AJAXajax是基于XMLHttpRequest 的,是不能跨域的。request = new XMLHttpRequest();request.onreadystatechange = function () { /*表示XMLHttpRequest对象的状态:0:未初始化。对象已创建,未调用open; 1:open方法成功调用,但Send方法未调用;
2017-09-28 11:00:07
318
原创 Thrift和Spring集成
1.服务端通过TMultiplexedProcessor同时暴露多个服务/** * Thrift通用服务启动类 可以和spring集成 */public class CommonServerDemo { private int port; private MapString, Object> exposedServerMap; public Common
2017-09-28 09:40:59
1327
原创 Thrift
1.DSL1.命名空间namespace java com.zhp 适用java语言namespace * com.zhp 适用于所有语言2.包含外部文件include "chapter3.thrift"引用包含文件的内容时使用 前缀.xxx。例如list getList(1:set ids) throws (1:MyError2 myerror,2:cha
2017-09-26 15:54:54
434
原创 API网关服务:Spring Cloud Zuul
1.Zuul简介 zuul的位置 zuul执行流程简单来说zuul将请求转发,并提供pre,post,error类型过滤器,这些过滤器执行的时间不同,对应不同的阶段
2017-09-21 16:05:34
572
转载 CAP/BASE理论
CAP理论告诉我们,一个分布式系统是不可能同时满足一致性(C:consistency)、可用性(A:Availability)和分区容错性(P: Partition tolerance)这三个基本需求,最多只能同时满足其中的两项。 一致性(C):在分布式系统中所有数据备份在同一时刻是否有同样的值。 可用性(A):在集群中一部分机器节点故障,集群整体是否还能响应客户端的读写请求。
2017-09-18 11:15:55
530
原创 RabbitMQ三种Exchange
1.Direct Exchange Direct Exchange是一种点对点模式。当消息发送到Direct Exchange时,如果routingkey匹配的话,消息就被投递到对应的队列。 注意有一个默认的direct类型交换器
2017-09-15 11:18:03
296
转载 趋势递增分布式ID生成方法:Snowflake
1.介绍 SnowFlake的结构如下(每部分用-分开): 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 1.第一位是标识位,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。 2.41位时间截(毫秒级)
2017-09-13 09:46:57
3030
1
原创 声明式服务调用:Spring Cloud Feign
1.使用方法 1.消费方基于spring mvc 注解自定义访问接口,这样相当于消费方和服务提供方各自维护一套接口。 2.基于继承的方法,服务提供方将对外接口打成单独的jar包提供出去,消费方依赖这个jar就可以了。缺点是服务提供方和消费方在构建期间就建立起依赖,修改接口的时候需要注意兼容性。 例:服务提供方提供接口public interface FeignContr
2017-09-12 13:17:13
4089
原创 客户端负载均衡 Spring Cloud Ribbon
1.基本思路客户端从服务中心获取服务提供者信息,当客户端使用服务名调用服务时,拦截器帮你把服务名替换为具体的服务地址,服务地址的选择是由路由规则先定。默认是线性轮询。
2017-09-08 15:12:52
504
原创 redis实现分布式锁
1.基本思想 http://doc.redisfans.com/string/set.html 有说明 如下命令 SET resource-name anystring NX EX max-lock-time 是一种在 Redis 中实现锁的简单方法。客户端执行以上的命令:如果服务器返回 OK ,那么这个客户端获得锁。如果服务器返回 NIL ,那么客户端获取锁失
2017-09-05 14:55:45
738
原创 服务治理 Spring Cloud Eureka
1.架构图1.ServiceProvider(服务提供者)会向EurekaServer做Register(服务注册)、Renew(服务续约)、Cancel(服务下线)等操作。2.EurekaServer之间会做注册服务的同步,从而保证状态一致,EurekaServer启动固定频率任务(默认60秒)检查租约是否到期(租约默认90秒)3.ServiceConsume
2017-09-04 15:49:35
351
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人