`
61234865
  • 浏览: 11677 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于会阻塞spring初始化线程对象的处理

阅读更多

需求前提:在容器加载的过程中,需要要同时加载某些特殊的会阻塞线程的对象,例如(自动启动msn并自动登陆)。

 问题描述:由于spring的初始化过程是单线程进行的,这种特殊的对象会导致线程阻塞,spring无法进行正常初始化。

  解决方案:

1.使用监听器。

2.延时加载。

3.二次加载。

方案分析:

第一种方案:此方法使用单独的线程来启动这类资源,因此不会影响到spring自身的初始化。问题在于,一般在业务需求中,我会都会需要通过


spring从DB中获取数据后再启动这类对象,例如(msn的email和密码都存于DB中)。而这里的listener线程和spring的初始化线程是同时进行的,因此,spring


未初始化之前是无法获取DB中资源的。并用此类listener貌似无法被spring托管

第二种方案:此方法的思路是在spring初始化的过程中,不进行特殊对象的初始化。等spring初始化完毕,各种资源都就绪后,再进行特殊对象的初


始化。问题:1.无法自动加载。2.手动初始化用户进程也会被阻塞

第三种方案:三spring加载完毕后,进行再次初始化,这个可以在springloadlistendr里去做二次初始化(注:用多线程去做,此时spring已经初始


化完毕,所有资源都可以正常获取),这样即可保证spring正常初始化,也可以保证所有特殊对象正常初始化。


需求问题分析:

以前一直以为,这种特殊的对象spring会启动新线程来处理,后来深入了解spring后发现,其实spring并没有对这种对象特殊对待。因为为了保证初


始化的完整性,这种对象是必需要启动新线程来初始化的。而spring则是单线程解决一些依赖关系后按顺序初始化的。之所以对spring产生错误的理解,认为


它会处理这种对象,是因为在平时使用过程中,遇到过一些会阻塞线程的对象,但spring并没有被阻塞。例如说TimerFactoryBean定时器,在spring里配置后


并没有阻塞。今天仔细看了一下这个类调用的过程,结果发现原来这个类在调用过程中自己进行了线程处理,因此不会阻塞spring的初始化线程了。

总结:

对于一些不理解的东西,最好先去猜测它实现,然后看看源代码来验证猜测的正确性。对于spring源代码的分析,不难发现,所有会阻塞线程的对象


,都需要用户自己去处理使得它不会阻塞,spring是不负责进行这些检测的。因为对spring而言,它也不知道哪些对象需要特殊处理。即使知道,它启动新线


程来处理这些对象的时候,也无法保证所有的依赖对象都正确初始化。注:上面所说的特殊对象的初始化,并不是指实例的生成,而是指实例生成后对会阻塞


线程的方法的调用。

 

分享到:
评论

相关推荐

    spring MVC 初始启动blocking queue

    `BlockingQueue`实现了`Queue`接口,并添加了阻塞操作,这意味着当队列满时,生产者线程会阻塞直到有空间可用;同样,当队列为空时,消费者线程也会阻塞直到有元素可取。这种设计有效地避免了忙等待,提高了系统的...

    spring在@Bean注解中initMethod调用方法异步

    当`initMethod`被设置为异步执行,即在后台线程中调用,它允许应用程序在不阻塞主线程的情况下完成复杂的初始化工作。这样的设计对于提高应用的响应性和非阻塞特性尤其有益。 `Sofaboot`是阿里巴巴开源的一款企业级...

    spring集成socket服务

    Spring容器管理着应用中的对象(即Bean),这些Bean在容器启动时被创建,并根据其配置进行初始化。监听器(Lifecycle)是Spring框架提供的一种机制,用于感知和响应容器的状态变化,如启动、停止等。我们可以实现`...

    netty4与spring集成

    3. **Netty 服务器启动**: 使用 Spring 的 ApplicationListener 或 CommandLineRunner 接口,在应用启动时触发 Netty 服务器的初始化和启动。这样可以确保 Netty 服务器在 Spring 容器启动后自动运行。 4. **...

    spring-tx事务管理实例

    事务超时可以防止长时间运行的事务阻塞系统资源,而懒加载则是在事务真正需要时才初始化相关对象,以提高系统效率。 总的来说,Spring事务管理通过其强大的声明式事务处理能力和对各种事务策略的支持,使得开发者...

    spring中邮件及定时任务

    在实际应用中,你可能需要结合Spring Boot,这是一个轻量级的Spring框架启动器,它简化了Spring应用的初始化和配置。Spring Boot提供了内置的Tomcat服务器和自动配置功能,使邮件服务和定时任务的集成变得更加简单。...

    netty_spring

    7. **启动与测试**:最后,可以通过 Spring 的 ContextLoaderListener 或 ApplicationContextInitializer 将 Spring 容器与 Servlet 容器(如 Tomcat)关联起来,使得 Netty 服务器在启动时初始化 Spring 容器。...

    java面试宝典,包含java基础篇、多线程、spring、springboot、mysql、redis、mq等等经典面试问题

    - Spring Bean的生命周期:初始化、销毁方法,Bean的作用域。 - Spring MVC:请求处理流程,DispatcherServlet,ModelAndView,Controller注解。 4. **Spring Boot**: - 自动配置:Spring Boot如何通过@...

    spring mvc中启动netty

    这通常涉及到将Spring MVC的控制器逻辑与Netty的网络处理逻辑相结合,以便在非阻塞I/O模型下运行。下面我们将详细探讨这个主题。 1. **Netty简介** Netty是一个Java NIO框架,提供了高度可定制的事件驱动架构,...

    java面试题目题目

    - 构造器:如何使用构造器初始化对象,以及构造器重载的概念。 - 异常处理:掌握try-catch-finally语句块,异常的分类及其处理方式。 - 包和访问修饰符:理解public、private、protected和默认访问权限的差异。 ...

    spring框架高级编程使用.pdf

    在这个例子中,`connectionMade`方法被用来初始化连接,`dataReceived`方法则处理接收到的数据。 ```python from twisted.internet import reactor from twisted.internet.protocol import Protocol, Factory from ...

    spring监听器共20页.pdf.zip

    在Spring应用启动、初始化、运行以及关闭的过程中,会触发一系列的事件,而监听器就是用来捕获并处理这些事件的组件。这份名为“spring监听器共20页.pdf”的文档很可能是对Spring监听器的详细讲解,涵盖了20个页面的...

    Java基础、JVM、并发编程与线程、设计模式、SpringBoot、SpringCloud、MyBatis、Redis面试题等

    5. **SpringBoot**:作为主流的Java开发框架,SpringBoot简化了Spring应用的初始化和配置。面试中可能会问到自动配置、Spring Boot Starter、Actuator、微服务架构、Spring Data JPA等。 6. **SpringCloud**:...

    Spring MVC 4.2.4.RELEASE 中文文档v

    对于异步请求的处理,文档展示了如何支持长时间运行的任务,而不会导致 Web 容器线程的阻塞。这部分内容对于处理需要长时间计算或调用外部服务的应用场景至关重要。 测试部分强调了对控制器进行测试的重要性,介绍...

    使用netty+spring搭建游戏框架

    - **Spring Bean容器**:Netty服务器启动时,可以利用Spring的Bean容器加载并管理ChannelInitializer和ChannelHandler实例,实现服务端的初始化。 - **Spring Event**:Netty的事件可以映射为Spring的...

    后端开发基础知识整理JAVA、JVM、操作系统、网络、设计模式、mysql、redis、多线程、spring、springboo

    - **User user = new User()做了什么操作**:分配内存、初始化对象等。 - **内存泄漏及解决方法**:避免使用无用的引用、及时关闭资源等。 - **HotSpot逃逸分析**:确定对象是否可以在栈上分配。 - **Java中的常量池...

    spring-android-rest-template-1.0.1.RELEASE.jar.zip

    2. 创建REST Template实例:在需要使用的地方初始化REST Template对象。 ```java RestTemplate restTemplate = new RestTemplate(); ``` 3. 配置HTTP消息转换器:根据需要处理的数据类型,添加相应的...

    Spring注解驱动开发实战-servlet

    这个方法会由一个单独的线程池处理,而不阻塞当前的请求处理线程。这样可以提高应用的性能,尤其是在需要进行耗时操作如数据库查询或远程服务调用时。 在实际应用中,我们可能还需要了解如何配置Spring的...

    netty4.x 与 spring 集成

    - Netty的非阻塞I/O模型使得它可以高效地处理大量并发连接,这与Spring的单线程模型不同。 - 需要理解如何在Spring中正确地处理Netty的异步回调,以避免线程安全问题。 5. **整合Netty的事件循环和Spring的任务...

    Netty+Spring Boot仿微信 全栈开发高性能后台及客户端

    Spring Boot是Spring框架的一个扩展,它简化了Spring应用的初始搭建以及开发过程。通过自动配置和起步依赖,Spring Boot使得开发者能够快速启动一个功能完备的应用。在本项目中,Spring Boot将作为后端的核心框架,...

Global site tag (gtag.js) - Google Analytics