背景介绍:

服务端期望使用 面向对象编程, 和 spring 结合的话只能是通过 prototype 的 bean 定义,并通过 getBean 获取.

优雅停机探究:

代码说明:

1. 类关系 SimpleSpringTest PrototypeScopeBean

    2. 执行流程: SimpleSpringTest内的方法通过getBean 获取prototype的 bean. 内有有线程池执行相关逻辑.

3. 两个类对实现了 spring 的关闭事件通知

4. 先上层SimpleSpringTest关闭连接,然后内部PrototypeScopeBean关闭线程shutdown.保证所有线程都执行完才退出. [ 否则由于内存无持久化,导致相关数据和流程丢失.分布式问题. 最好通过 mq 发送. ]

操作流程:

1. 启动代码

2.关闭代码

3. 正常结果: 按预期顺序关闭. 暂停3秒后,输出对应的关闭日志

异常:

1. 都打印出了对应的关闭日志.但是没有暂停3秒.

深入探究:

1.  对应的线程池里并没有执行 worker. 还以为我自己对线程池的 shutdown和 await 的理解错误了. 细细又看了一遍源码.还研究了下interruptIdleWorkers里的线程 interrupt方法,把对应线程都中断了. 但是runnable 的 sleep又没有打印出被interrupt的错误日志. 以为自己对interrupt 理解错了.又学习了一遍interrupt.

2. 最终发现原来的PrototypeScopeBean和 close 时的PrototypeScopeBean不是同一个 bean

3. 回过头看 spring 的关闭流程代码.

发现发起 event 时会回调

1. sington 实例,

2. get 新的 prototype bean

而我的线程池是非 static 的,导致出错. 无法完成优雅关闭.

xml 配置的都会生成新的 bean 定义.

发现了通知的 list,通过

defaultRetriever.applicationListeners  笔者注释: 实现了 listener 的sington 的实例.

NOTE: 如果 bean 有@scope 的 prototype 注解,但是 xml 里又配置了 <bean,id 不一致> 但是没有配置 scope. 会生成两个 beanDefinition,且一个是 sington,一个是 prototype. 注解不影响 xml 的属性. 单例的实例会主动生成.

defaultRetriever.applicationListenerBeans 笔者注释:  字符串 ,所有实现了listener的 beanDefinition Name

NOTE:每个在 annotation 注解 和 xml 配置解析后都会生成一个 beanDefinition. 只有sington才会生成直接生成实例. 可在 getBean(class)的代码里证明.

总结:

1.  beanDefinition 何时生成?

id 是@service 的 value, xml 配置里的 id .一个sington 配置两遍,会有两个 beanDefinition. 注解解析也有. 同时生成. 如果 id 一致,xml 会覆盖注解.

2. 实例何时生成?

singoton: xml 定义解析时,注解解析时

prototype: getBean 时. 一旦有多个 beanDefinition,通过getBean(class)会报错 bean 数量不对.

3. spring 事件通知通知哪些对象?

1. 所有继承了 listener 的 sington 实例

2. 新建一个 prototype 的实例,并且调用. 所以 prototype 里被事件处理的东西最好是 static 的. 不然没有意义.这点面向对象写法容易出错,且容易内存泄露.新建大量的线程池.线程池何时被回收.?

4. prototype的特点是什么?

  1.  getBean("name")时 或者被注入autowired injected时会自动生成一个 bean

2. getBean(class) 在只有一个 beanDefinition 时不会抛错. 不要 xml 写了一个,注解又有一个.

NOTE: 这个接口会有锁,并发下性能比较差. 3.1.2

附录:

事件通知堆栈:

  • "Thread-0"@2,180 in group "main": RUNNING
  • onApplicationEvent():48, PrototypeScopeBean {com...test.unmock.test}
  • onApplicationEvent():15, PrototypeScopeBean {com..test.unmock.test}
  • multicastEvent():97, SimpleApplicationEventMulticaster {org.springframework.context.event}
  • publishEvent():324, AbstractApplicationContext {org.springframework.context.support}
  • doClose():1025, AbstractApplicationContext {org.springframework.context.support}
  • run():958, AbstractApplicationContext$1 {org.springframework.context.support}

从线上问题谈spring生命周期类lifeCycle类和bean的生命周期

从prototype beandefinition 谈 spring 的关闭流程和 prototype 的特性的更多相关文章

  1. 浅谈Spring MVC知识

    关于MVC框架,我相信大家都不陌生,都会说也就是模型-视图-控制器这三层的框架结构,如果你参加面试的时候考官会问:“MVC框架是什么?你说一说.”其实我们都知道这个问题还需要问的,只要你是一个开发人员 ...

  2. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式, ...

  3. spring mvc处理流程概述

    大部分Java应用都是Web应用,展现层是Web应用不可忽略的重要环节.Spring为展现层提供了一个优秀的Web框架-Spring MVC.和众多其他Web框架一样,它基于MVC设计理念,此外,它采 ...

  4. Spring MVC 编程流程步骤

    Spring MVC 编程流程步骤 1. 建立Maven工程 2. 添加Spring MVC依赖 <dependencies> <dependency> <groupId ...

  5. spring cloud: 关闭ribbon负载均衡

    spring cloud: 关闭ribbon负载均衡 1.eureka服务 2.2个user服务:7900/7901 3,movie服务 movie服务去请求 user的用户信息,而此时只想请求790 ...

  6. Ioc容器beanDefinition-Spring 源码系列(1)

    Ioc容器beanDefinition-Spring 源码系列(1) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器 ...

  7. 浅谈Spring中的Quartz配置

    浅谈Spring中的Quartz配置 2009-06-26 14:04 樊凯 博客园 字号:T | T Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在 ...

  8. 浅谈Spring的两种配置容器

    浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41   作者:黄小鱼ZZZ     ...

  9. 一文读懂Spring MVC执行流程

    说到Spring MVC执行流程,网上有很多这方面的文章介绍,但是都不太详细,作为一个初学者去读会有许多不理解的地方,今天这篇文章记录一下我学习Spring MVC的心得体会 话不多说,先上图:   ...

随机推荐

  1. C# interface 的特性 无法被implement class继承

    最近做interface添加特性后,implement class 无法继承. 微软要求class是实现Interface而不是继承,所以我们必须手动添加特性,而不能自动继承. 对于abstract ...

  2. Java并发编程,互斥同步和线程之间的协作

    互斥同步和线程之间的协作 互斥同步 Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLo ...

  3. [Noip模拟题]统计方案​

    题目并不难,想一下就会了,我真的智商持续下降,取模情况下做除法我都没想到逆元. 总之想到逆元就好写了,还是\(meet\ in\ the\ middle\)裸题,数组开不下用\(hash/map\)存 ...

  4. js 左侧树添加选择样式

    选择样式添加 menuToggle: function() { var menus = $('.nav-primary').children('li'); var tog = menus.has('. ...

  5. ShareSDK集成遇到问题

    解决方案

  6. 使用JMeter上传文件

    使用JMeter录制文件上载 创建JMeter测试计划的最简单方法是使用HTTP(s)测试脚本记录器记录相应的请求.JMeter充当代理服务器,捕获Web浏览器与被测应用程序(AUT)之间的所有流量, ...

  7. SNMP4J 总结

    一.SNMP4J介绍 SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应.SNMP4J是纯面向对象设计与SNMP++(用C++实现SNMP ...

  8. mysql(MySQL客户端连接工具)

    在MySQL提供的工具中,DBA使用最频繁的莫过于mysql.这里的mysql不是指MySQL服务,也不是mysql数据库,而是连接数据库的客户端工具.类似于Oracle的sqlplus. 语法: m ...

  9. nodejs项目报Process finished with exit code 8错误

    看控制台打印出来的错误:Error: listen EADDRNOTAVAIL  这是监听ip错误,没有该端口号. 修改IP地址,改成你所需要的ip地址 一般都是在自己本机上运行,所以把监听的ip改成 ...

  10. Java面试:投行的15个多线程和并发面试题(转)

    多线程和并发问题已成为各种 Java 面试中必不可少的一部分.如果你准备参加投行的 Java 开发岗位面试,比如巴克莱银行(Barclays).花旗银行(Citibank).摩根史坦利投资公司(Mor ...