设为首页 收藏本站
查看: 340|回复: 0

[经验分享] Tomcat启动完成后再执行一个指定的方法

[复制链接]

尚未签到

发表于 2017-1-31 06:28:28 | 显示全部楼层 |阅读模式
  本文主要介绍Tomcat启动真正完成后(即在eclipse的控制台上出现类似于Server started in 2300ms这样的消息后)执行一个操作。

如下的3种方法都是在Tomcat启动过程中执行的,这样会影响Tomcat的启动时间,从而造成Tomcat不能启动成功: 
1.配置一个Servlet默认自动启动。 
2.配置一个Listener来启动 
3.实现Spring的InitializingBean接口 

要想不影响Tomcat的启动,便联想到了异步调用 。即无非就是新创建了一个线程来单独执行,这样Tomcat执行到相应的操作就可以直接继续下去了,不会处于等待的状态,避免了启动超时。基于这样的思想,可以有两种方法来完成:
  方法一:使用如上三种方式中的任何一种来在启动Tomcat的过程中执行相应的方法,然后在执行的过程中使用另一个线程来执行:比如说将要执行的方法所在的类继承HttpServlet并在web.xml中配置,然后在该Servlet的init中去调用想要执行的方法时(假设这个方法名叫start()),启动另一个线程来执行,具体代码如下。

/**
*
*/
package com.ebay.montage.pm;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.ebay.montage.pm.collector.NucleonEventDataCollector;
import com.ebay.montage.pm.constants.CMConstants;
import com.ebay.montage.pm.utils.ConfigurationUtils;
import com.ebay.montage.pm.utils.LoggerUtils;
import com.ebay.system.ShutdownAwaitLatch;
/**
* Trigger to consume data from Nucleon Event Bus
*
* @author Josh Wang(Sheng)
*
* @email  swang6@ebay.com
*/
@Component("processor")
public class NucleonEventProcessor extends HttpServlet {
private static final long serialVersionUID = -9045451275234606838L;
private static final Logger log = Logger.getLogger(NucleonEventProcessor.class);
// Servlet的init方法会在Tomcat启动的时候执行
@Override
public void init() throws ServletException {
FutureTask<String> task = new FutureTask<String>(new Callable<String>(){
@Override
public String call() throws Exception {
start(); // 使用另一个线程来执行该方法,会避免占用Tomcat的启动时间
return "Collection Completed";
}
});
new Thread(task).start();
}
// 希望Tomcat启动结束后执行的方法
private void start() {
if (ConfigurationUtils.isEnableEventCollector()) {
String topic = CMConstants.NUCLEON_EVENT_TOPIC;
new NucleonEventDataCollector().collect(topic);
LoggerUtils.info(log, "NuclenonEventDataCollector started to consume data from Collector Bus - NUCLEON_EVENT_TOPIC: " + topic);
new ShutdownAwaitLatch().awaitForShutdown();
LoggerUtils.info(log, "Complete processing and publishing Event Data");
} else {
log.info("There disable the collector, please enable it on dev/qa/prod property if needed");
}
}

}

  web.xml中的配置

    <servlet>
<servlet-name>event-collector</servlet-name>
<servlet-class>com.ebay.montage.pm.NucleonEventProcessor</servlet-class>
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>event-collector</servlet-name>
<url-pattern>/event-collect</url-pattern>
</servlet-mapping>
  方法二:使用Spring的Timer或者是著名的Quartz在Tomcat启动后再执行该方法,Spring中的Timer非常简单,这个地方不想讲解了,Quartz相对更复杂些,下面主要介绍下在Spring中怎么样使用Quartz来实现上面的需求:
  实现Job接口的任务实现类 :

Java代码   DSC0000.png





  • public class InitJob implements Job {  
  •   
  •     @Override  
  •     public void execute(JobExecutionContext arg0) throws JobExecutionException {  
  •         // TODO Auto-generated method stub  
  •     }  
  •       
  •     public void executeA() throws JobExecutionException {  
  •         // TODO Auto-generated method stub  
  •         .........  
  •     }  
  Spring配置文件中配置的任务 

Xml代码  





  • <bean id="initJob" class="com.xxx.services.InitJob" />  
  • <!--定时器任务配置(开始)-->       
  •     <!--配置JOB-->  
  •     <bean id="initJobDetail"  
  •         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
  •         <property name="targetObject" ref="initJob" />  
  •         <property name="targetMethod" value="executeA" />  
  • <!--         <property name="arguments" /> -->  
  •     </bean>  
  •     <!--配置Trigger-->  
  •     <bean id="initTrigger"    
  •         class="org.springframework.scheduling.quartz.SimpleTriggerBean">    
  •         <property name="jobDetail" ref="initJobDetail" />    
  •         <property name="startDelay" value="1000" />  
  •         <property name="repeatInterval" value="0" />  
  •         <property name="repeatCount" value="0" />  
  •     </bean>  
  •     <!--配置Scheduler-->  
  •     <bean id="schedulerFactory"    
  •         class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">    
  •         <property name="triggers">    
  •             <list>    
  •                 <ref bean="initTrigger" />    
  •             </list>    
  •         </property>    
  •         <property name="autoStartup" value="true"/>  
  •     </bean>  
  •     <!--定时器任务配置(结束)-->  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-335469-1-1.html 上篇帖子: tomcat在windows上的配置和基本使用 下篇帖子: 再论Tomcat和STRUTS中的中文问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表