- 博客(49)
- 收藏
- 关注
原创 eureka三级缓存源码级解析
服务端增量获取注册表eureka 的三级缓存可以说是设计的整个中间件非常大的亮点,这里以增量获取注册表信息为例,直接从服务端开始进行分析我们直接来到获取缓存的部分@VisibleForTesting Value getValue(final Key key, boolean useReadOnlyCache) { Value payload = null; ...... if (useReadOnlyCache) {
2021-02-22 15:54:37 1460
原创 springboot 启动流程
spring 启动 public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { //从springboot return new SpringApplication(primarySources).run(args); }这里主要分为两步,一个是spring Application的构造方法另一步时执行 run()SpringApplication()
2021-02-06 13:37:37 96
原创 LinedBlockingQueue 源码解析
构造方法 public LinkedBlockingQueue() { this(Integer.MAX_VALUE); }空参构造方法,也就是说没有传入大小,队列的大小默认为Integer的最大值属性 private final int capacity;//容量 private final AtomicInteger count = new AtomicInteger();//存储的元素个数 transient Node<E> head
2021-01-04 15:22:54 123 1
原创 ScheduledThreadPoolExecutor 源码解析
概述ScheduledThreadPoolExecutor 常常用来作为延迟任务,或者是周期性执行某个任务延迟任务简单的使用示如下,如果需要周期性执行任务,使用 scheduleAtFixedRate() public static void main(String[] args) throws ClassNotFoundException, ExecutionException, InterruptedException { ScheduledThreadPoolExecutor s
2021-01-04 14:22:56 132
原创 Callable 源码解析
概述这里Callable 的使用以 FutureTask 举例,源码示例如下 public static void main(String[] args) throws ClassNotFoundException, ExecutionException, InterruptedException { FutureTask futureTask = new FutureTask(new Callable() { @Override pub
2021-01-04 13:03:16 268
原创 ArrayBlockingQueue 源码解析
ArrayBlockingQueue 属性首先来看看ArrayBlockingQueue 的属性public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { private static final long serialVersionUID = -817911632652898426
2020-12-31 00:11:18 154 2
原创 线程池提交任务和执行任务源码解析(2)
概述因为篇幅太长所以分两篇博客进行说明,本文算是对《线程池提交任务和执行任务源码解析》的补充第一篇博客《线程池提交任务和执行任务源码解析》—》https://blog.csdn.net/kznsbs/article/details/111958345继续execute()方法的说明 public void execute(Runnable command) { ... int c = ctl.get(); if (workerCountOf(c)
2020-12-30 23:01:51 90
原创 线程池提交任务和执行任务源码解析
线程池提交我们就按照平时使用的方式,从execute()这以execute这个方法为入口 public void execute(Runnable command) { ... int c = ctl.get(); if (workerCountOf(c) < corePoolSize) { if (addWorker(command, true)) return;
2020-12-30 14:23:10 201
原创 rocketmq 消息发送
概述rocketmq的消息发送大体可以分为三部1.消息的验证2.队列的选择3.消息的发送消息的验证以send 方法为入口 public SendResult send( Message msg) throws MQClientException, RemotingException, MQBrokerException, InterruptedException { Validators.checkMessage(msg, this);//消息验证
2020-12-29 17:27:05 498 2
原创 Rocketmq 故障延迟 源码解析
故障延迟在 rocketmq 中,有两种延迟机制1. 开启故障延迟2. 关闭故障延迟(默认)关闭故障延迟通过 sendLatencyFaultEnable = false 表示关闭故障延迟所谓的关闭故障延迟就是,在生产者发送消息的时候,可能因为网络原因或者是其他外接因素,导致消息发送失败,这个时候就会进行消息发送的重试(单向消息除外)那么在 broker 端机会记录一下这个失败的broker,所以下次轮询到这个broker 的时候就会跳过这个broker,这样就减少了消息发送失败的概率这里关于
2020-12-29 15:28:03 652 5
原创 mybatis 插件执行原理
Interceptorpublic interface Interceptor { Object intercept(Invocation invocation) throws Throwable; default Object plugin(Object target) { return Plugin.wrap(target, this); } default void setProperties(Properties properties) { // NOP }
2020-12-20 21:44:37 112
原创 spring 循环依赖源码解析
循环依赖循环依赖在java中其实并不是一个问题而是一个现象,例如public class AService{ public BService bservice;}public class BService{ public AService aService;} AService aService = new AService();BService bService = new BService();aService.bService = bService;bService.aServi
2020-12-08 00:20:37 107
原创 springBean的实例化过程详解---createBeanInstance(2)
回到createBeanInstance Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName); if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR || mbd.hasConstructorArgumentValues() || !ObjectUtils.i
2020-12-05 15:40:16 190
原创 springBean的实例化过程详解---createBeanInstance(1)
概述spring bean的实例化是在bean的沈明周期中createBeanInstance实现的createBeanInstance Class<?> beanClass = resolveBeanClass(mbd, beanName); if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed())
2020-12-04 16:44:58 486 1
原创 Spring之 @Configuration 解析
概述在 spring 进行 执行refresh() 的invokeBeanFactoryPostProcessors(beanFactory),其中最重要的是执行ConfigurationClassPostProcessor 的postProcessBeanDefinitionRegistry()和 postProcessBeanFactory()这两个方法在 postProcessBeanDefinitionRegistry()中,会进行类的扫描,然后生成对应的 beanDefinition,在这个过
2020-12-04 13:16:45 339
原创 RocketMQ--NameServer启动
概述NameServer 可以说式 Broker 的注册中心,Broker 在启动的时候,会根据配置信息向所有的 NameServer 进行注册,NameServer 会和每和前来注册的 Broker 保持长连接,并每 30s 检查 Broker 是否还存活,对于宕机的 Broker ,NameServer 会将其从列表中剔除当生产者需要向 Broker 发送消息的时候,就会先从 NameServer 里面获取 Broker 的地址列表,然后负载均衡,选择一台消息服务器进行发送Name Server
2020-12-03 16:59:12 1117
原创 spring源码解析之ConfigurationClassPostProcessor
概述在invokeBeanFactoryPostProcessors中,spring回对spring中默认的BeanFactory的后置处理器进行调用,而这里相关的最主要的类就是ConfigurationClassPostProcessor,ConfigurationClassPostProcessor这个类继承自BeanDefinitionRegistryPostProcessor,而BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcess
2020-12-03 15:49:59 181
原创 netty源码解析之编码和解码
概述关于客户端读取数据的核心是 unsafe 的read()方法,对于客户端的unsafe而言 其具体的实现类是NioByteUnsaferead()public final void read() { final ChannelConfig config = config(); if (shouldBreakReadReady(config)) { clearReadPending();
2020-12-02 21:19:52 317
原创 Spring源码之invokeBeanFactoryPostProcessors()
invokeBeanFactoryPostProcessors概述一般情况下:执行到这个方法的beanFactory的beanDefinitionMap中有6个BeanDefinition,5个基础BeanDefinition+AppConfig的 BeanDefinition而这6个中只有一个BeanFactoryPostProcessor:ConfigurationClassPostProcessor这里会执行ConfigurationClassPostProcessor进行@Component
2020-12-02 12:30:06 114
原创 netty源码解析---selector.run() (2)
概述本文是对《netty源码解析—selector.run()》一文的后续补充,在《netty源码解析—selector.run()》分析完成了switch部分,那么接下来开始分析netty 的事件轮询部分,以及后续processSelectedKeys(处理完switch部分,就开始进行事件轮询的,核心的方法就是 processSelectedKeys() private void processSelectedKeys() { if (selectedKeys != nul
2020-11-24 17:44:37 164
原创 netty源码解析---selector.run()
概述本文将对netty的选择器的工作原理进行解析run()直接步入正题!!!protected void run() { for (;;) { try { try { switch (selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())) { case SelectStrate
2020-11-23 18:48:13 159
原创 netty之wakeup详解
有关wakeup变量的使用有一下几个地方(这里只使用netty普通任务举例,不讨论定时任务)部分1,NioEventLoop.select() if (hasTasks() && wakenUp.compareAndSet(false, true)) { selector.selectNow(); selectCnt = 1; break;
2020-11-23 18:11:14 912 3
原创 netty源码解析---bind()(4)---dobind0()
概述接着笔者的上一篇博客《netty源码解析—bind()(3)—register0()》,在完成register0()的调用之后,又会回到doBind()方法继续执行,到目前位置bossGroup的selector 还没有对任何事件感兴趣,也没有为服务端进行任何ip以及端口的绑定dobind0()private static void doBind0( final ChannelFuture regFuture, final Channel channel,
2020-11-22 15:34:03 299
原创 netty源码解析---bind()(3)---register0()
概述在netty的bind方法里,经过 channel(NioServerSocketChannel) 的实例化后初始化后,开始向pipeline里添加 handler,然后还会调用register向 bossGroup 里面注册 channel(NioServerSocketChannel),但是这里只会先将这个register0 方法作为一个任务放入任务队列中,然后就会开启reactor ,接着这个线程就会开始执行之前的任务队列,就会执行register0register0()private vo
2020-11-20 17:56:19 456
原创 netty源码解析---bind()(2)
概述《netty源码解析—bind()》一文的细节补充init().addLast()当netty获取到channel后,会向channel的pipeline 里面添加ChannelInitializer 这个handler追溯到addLast()方法的最底层public final ChannelPipeline addLast(EventExecutorGroup group, String name, ChannelHandler handler) { //group=nul
2020-11-20 14:56:54 110
原创 Spring什么周期之销毁
触发销毁当我们在独立使用spring框架的时候往往会发现,标注了@PreDestory的方法并没有在进程结束前调用,没有触发生命周期的销毁方法,那么如何去触发销毁的生命周期方法呢?有两种方式1.调用applicationContext.close(),这种方式可以说是手动的去关闭容器,触发生命周期销毁2.调用applicationContext.registerShutdownHook(); 这种方式是通过注册一个钩子函数触发生命周期的销毁其实方式一和方式二都是调用到doClose(),所以接下来看
2020-11-19 17:19:33 1061 1
原创 netty源码解析---bind()
概述bind()方法用于用于进行端口号的绑定bind() public ChannelFuture bind(int inetPort) { return bind(new InetSocketAddress(inetPort)); }new InetSocketAddress(inetPort) 里面会将本机的ip和传入的端口封装为InetSocketAddress对象深挖进入dobind()private ChannelFuture doBind(final SocketAdd
2020-11-18 19:13:42 540
原创 netty源码解析---bootStrap的初始化
概述本文主要讲述bootStrap的初始化group()这里以服务端的初始化为例子//删除了非核心代码public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) { super.group(parentGroup); this.childGroup = childGroup; return this; }从这里的初始化可以看出,对于
2020-11-17 21:48:06 141
原创 netty源码解析---bossGroup初始化
概述本文主要讲述netty bossGroup初始化相关流程初始化bossGroup实际类型是,NioEventLoopGroup,即然探究初始化流程,那么直接进入构造方法 public NioEventLoopGroup(int nThreads, Executor executor, final SelectorProvider selectorProvider, final SelectStrategyFactory select
2020-11-17 21:28:16 348 1
原创 @Resource源码解析
概述@Resource这个注解在实现上很类似,但是于@Autowired在一般情况下是先byType,再byName,但是@Resource则相反,通知@Resource还可以单独制定注入的bean的名字,具体实现也是通过一个后置处理器进行实现的,这个后置处理是CommonAnnotationBeanPostProcessor@Resource的自动注入对于@Resource的自动注入而言,其注入的方法也是postProcessProperties这个方法public PropertyValues
2020-11-11 17:09:17 790
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人