Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(例如顺序:1、初始化spring容器,2、初始化线程池,3、加载业务代码,将数据库中数据加载到内存中)

摘要:
最近,该公司需要进行功能迁移。最初在后台使用的Netty现在将迁移到uap,这意味着所有后台代码都无法通过Netty编写的加载序列加载。问题是如何按照原始加载顺序加载迁移到tomcat的代码(例如:1.初始化spring容器,2.初始化线程池,3.加载业务代码,并将数据库中的数据加载到内存中)。我个人的第一个想法是在tomcat中添加监控。当tomcat启动时,首先加载监控中的方法和方法

  最近公司要做功能迁移,原来的后台使用的Netty,现在要迁移到在uap上,也就是说所有后台的代码不能通过netty写的加载顺序加载了。

  问题就来了,怎样让迁移到tomcat的代码按照原来的加载顺序进行加载(例如顺序:1、初始化spring容器,2、初始化线程池,3、加载业务代码,将数据库中数据加载到内存中)。我个人首先想到的是在tomcat中加监听,tomcat启动时先加载监听中的方法、方法中的加载顺序也就是按照我拟定的顺序进行。

  然后我查了一些资料,发现了两种解决方案:

    1、通过tomcat的类加载起解决;

      分析:感觉没有方法2方便切不容易处理,需要改大量代码,所以只是了解了下,没有细看,可以了解博客:http://www.cnblogs.com/xing901022/p/4574961.html

    2、通过监听去处理(和我想的方向是一致的,但细看了一些资料后发现了一些通用问题):

      Tomcat服务器启动时自动加载数据到缓存,这就需要创建一个自定义的缓存监听器并实现ServletContextListener接口,并且在此自定义监听器中需要用到Spring的依赖注入功能.在web.xml文件中监听器配置如下:

  1. <listener>  
  2.         <listener-class>  
  3.             org.springframework.web.context.ContextLoaderListener  
  4.         </listener-class>  
  5. </listener>  
  6. <listener>  
  7.     <listener-class>  
  8.         com.liulei.test.listener.CacheListener  
  9.     </listener-class>  
  10. </listener>  

      上面的配置细细大意为,先配置spring监听器,启动spring,再配置一个缓存监听器,我希望他们是顺序执行的,因为在缓存监听器中需要 spring注入其他对象的实例,我期望在服务器加载缓存监听器前加载Spring的监听器,将其优先实例化。但是实际运行发现他们并不是按照配置的顺序加载的。

      对于此问题的解决方案我的个人观点就是重写一下spring的ContextLoaderListener  ,在配置文件中只加在这一个监听类就可以,在重写的方法中加入自己的(2、初始化线程池,3、加载业务代码)业务代码,然后查了一下资料也有类似的处理方案来落实了我的想法是正确的。

      举一个重写ContextLoaderListener  的例子:

  1. public class ContextLoaderListenerOverWrite extends ContextLoaderListener {  
  2.     private StartServer startServer;  
  3.     @Override  
  4.     /** 
  5.      * @description 重写ContextLoaderListener的contextInitialized方法 
  6.      */  
  7.     public void contextInitialized(ServletContextEvent event) {  
  8.         super.contextInitialized(event);  
  9.         startServer = StartServer.getInstances();
  10.         startServer.start();
  11.         /* 
  12.          如果您的系统还需要其他业务代码可以卸载此处 
  13.          */  
  14.     }  
  15. }  
  16. 这样我的问题就得到了解决,再次记录一下自己解决的思路和流程~

免责声明:文章转载自《Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(例如顺序:1、初始化spring容器,2、初始化线程池,3、加载业务代码,将数据库中数据加载到内存中)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇maven 基本框架搭建Communication between C++ and Javascript in Qt WebEngine(转载)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

dns缓存刷新时间是多久?dns本地缓存时间介绍

原文: http://www.winwin7.com/JC/4742.html dns缓存刷新时间是多久?一般来说,我们只知道DNS解析是互联网绝大多数应用的实际寻址方式,在我们打开某站点,DNS返回了正确的IP之后,此时系统会将dns缓存保存到本地,当我们再次访问该站点的时候会自动调用本地保存的dns缓存从而达到立马打开网页,速度非常快!但是dns缓存文...

RocketMQ消息至少一次(At least Once)投递和消费

至少一次(At least Once)指每个消息必须投递一次。Consumer先Pull消息到本地,消费完成后,才向服务器返回ack,如果没有消费一定不会ack消息,所以RocketMQ可以很好的支持此特性。 生产者 在同步非顺序投递的时候,每次都是轮询到不同的队列: Message message = new Message("topic...

译文:前端性能的重要性 The Importance of Frontend Performance

欢迎訪问我的主页。最新的文章我会首先公布在个人主页上: http://blog.guaidm.com/shocky/ 原书下载地址:http://pan.baidu.com/s/1pJocRwB        在我的web开发生涯里,大部分时候我都是作为一个后台project师。这样一来,我投入了非常多的精力去研究、练习怎样通过后台优化来提升项目产品...

spring + redis 实现数据的缓存

1、实现目标   通过redis缓存数据。(目的不是加快查询的速度,而是减少数据库的负担)   2、所需jar包      注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要配对使用,否则将会报错。因为commons-pooljar的目录根据版本的变化,目录结构会变。前面的版本是org.apache.pool,而...

监听器在游戏开发中的应用消息回调

我一向是不太喜欢给一些东西强加上个名字。但为了随波逐流,我还是这样做了。 在我们的游戏开发中,通常会遇到两个模块之间的通信。 回调估计是最常用的方式了。 回调的设计思想很简单,就是两个对象相互注册,然后在需要的时候调用对方的函数。 如下: class B; class A { public: void RegisterCallback(B* pB) { m...

Go -- LFU类(缓存淘汰算法)(转)

1.LFU类 1.1.LFU 1.1.1.原理 LFU(LeastFrequentlyUsed)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。 1.1.2.实现 LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排序。 具体实现如下: 1.新加...