`
Josh_Persistence
  • 浏览: 1632126 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

Tomcat启动完成后再执行一个指定的方法 - 不影响Tomcat的启动时间

阅读更多

本文主要介绍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代码  收藏代码
  1. public class InitJob implements Job {  
  2.   
  3.     @Override  
  4.     public void execute(JobExecutionContext arg0) throws JobExecutionException {  
  5.         // TODO Auto-generated method stub  
  6.     }  
  7.       
  8.     public void executeA() throws JobExecutionException {  
  9.         // TODO Auto-generated method stub  
  10.         .........  
  11.     }  

 

 

Spring配置文件中配置的任务 

Xml代码  收藏代码
  1. <bean id="initJob" class="com.xxx.services.InitJob" />  
  2. <!--定时器任务配置(开始)-->       
  3.     <!--配置JOB-->  
  4.     <bean id="initJobDetail"  
  5.         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
  6.         <property name="targetObject" ref="initJob" />  
  7.         <property name="targetMethod" value="executeA" />  
  8. <!--         <property name="arguments" /> -->  
  9.     </bean>  
  10.     <!--配置Trigger-->  
  11.     <bean id="initTrigger"    
  12.         class="org.springframework.scheduling.quartz.SimpleTriggerBean">    
  13.         <property name="jobDetail" ref="initJobDetail" />    
  14.         <property name="startDelay" value="1000" />  
  15.         <property name="repeatInterval" value="0" />  
  16.         <property name="repeatCount" value="0" />  
  17.     </bean>  
  18.     <!--配置Scheduler-->  
  19.     <bean id="schedulerFactory"    
  20.         class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">    
  21.         <property name="triggers">    
  22.             <list>    
  23.                 <ref bean="initTrigger" />    
  24.             </list>    
  25.         </property>    
  26.         <property name="autoStartup" value="true"/>  
  27.     </bean>  
  28.     <!--定时器任务配置(结束)-->  

 

 

 

3
1
分享到:
评论
2 楼 路小尘 2017-10-09  
暴露了你的东家,swang6@ebay.com, 哈哈。我没找到你的邮件地址呢。。。莫非已经离职了?
1 楼 1927105 2014-05-07  

有个@PostConstruct注解是在类初始化之后执行的

LZ也可以试试

相关推荐

    tomcat环境变量配置

    那么你的JDK就配置成功了,当然最好是再试验一下是否配置成功,那么就写一个简单的程序验证一下: Public class Test{ public static void main{ System.out.println("successful"); } } 运行代码,...

    Nginx+Tomcat负载均衡

    会出现如下图,如果你再关掉一个tomcat,刷新后页面会依然显示说明 负载均衡成功了。 *" pageEncoding="UTF-8"%&gt; %&gt; &lt;html&gt; &lt;head&gt; &lt;/head&gt; &lt;body&gt; 88 &lt;!--server1 这里为 88 --&gt; (request....

    windows_server2003+tomcat+iis6整合

    一、下载一个整合需要的文件isapi_redirect.dll 1,我们将得到isapi_redirect.dll然后将isapi_redirect.dll拷贝到tomcat安装目录下的 iis 文件夹里(可随意自定义,只要放在tomcat目录下就可以,最好单独建文件夹)...

    windows运行jar包指定jdk路径

    windows运行jar包指定jdk路径的脚本文件。可以不用系统的jdk运行,指定某个文件下的jdk运行jar包

    tomcat6、7、8、9, maven3.5

    一个新的主要版本的初始版本通常在几个月的时间内从Alpha过渡到Beta到Stable。但是,稳定级别仅在Java规范发布实现已完成时可用。这意味着在所有其他方面被认为稳定的版本,如果规格不是最终的,仍然可以标记为Beta...

    连通助手,tomcat自动重启工具,nginx自动重启工具

    间隔、定时检测url,异常时执行指定程序。可用于tomcat健康检测、定时重启。 连通网址:检测是否正常访问的url 监测间隔(s):几秒检测一次url 超时时间(s):检测url允许的最长时间 执行程序:url检测异常时要执行的程序 ...

    解决docker容器启动后马上退出的问题

    最后证明这个方法是可行的,在实验过程中遇到一个问题,容器启动后会马上停止。 经查阅资料: Docker容器同时只能管理一个进程,如果这个进程退出那么容器也就退出了,但这不表示容器只能运行一个进程(其他进程可在...

    tomcat7w.exe 出现指定的服务未安装的解决方法

    以上这篇tomcat7w.exe 出现指定的服务未安装的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:Tomcat服务无法启动的问题的解决方法window7下...

    Redis的配置、启动、操作和关闭方法

    一、启动Redis 1.默认配置启动 执行redis-server命令,按照默认的redis.conf配置文件中的配置启动Redis,如下: 因为默认配置无法自定义配置。所以该方式不会再生产环境中使用 2.运行配置启动 在命令redis-server后...

    Tomcat中的catalina.bat原理详细解析

    startup.bat 只是找到catalina.bat 然后执行catalina.bat 来启动tomat的。下面我们来分析下catalina.bat 验证CATALINA_HOME 环境变量 验证CATALINA_HOME 设置是否正确,如果不正确,重新设置CATALINA_HOME 环境...

    超级有影响力霸气的Java面试题大全文档

    sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程...

    java 面试题 总结

    sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程...

    Installanywhere打包javaweb项目

    2、Tomcat -- 由于客户可能是不懂软件的,那么我们就需要下载一个免安装解压版的Tomcat,直接去官网下载 3、Mysql -- 同理,下载免安装版的mysql数据库 二 预处理阶段 1、对Tomcat进行部分优化,具体根据情况而定,...

    Activiti的安装详细过程

    再启动 H2 数据库访问服务 ( C:\mash_activiti-5.6\apps\h2\h2.start.bat , H2 程序访问开放端口为 9092 ) 我在安装使用过程中遇到如下一些问题: tomcat 控制台显示的中文乱码 解决办法:修改文件 apps...

    Activiti6.0教程例子下载

    4. TaskService: 在Activiti中业务流程定义中的每一个执行节点被称为一个Task,对流程中的数据存取,状态变更等操作均需要在Task中完成。TaskService提供了对用户Task 和Form相关的操作。它提供了运行时任务查询、...

    深入浅出Hibernate源码

    它会自动进行数据库初始化、编译、启动tomcat容器.(此命令将会启动tomcat,因此之前tomcat必须处于停止状态) 然后,打开您的浏览器,输入http://localhost:8080/forum 您应该看到我们的示例正常运行. 9, 在您的...

    java面试题

    答:sleep()是线程类的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但监控状态依然保持,到时候会自动恢复。 wait()是Object类的方法,对此对象调用了wait方法导致本线程放弃对象锁,进入等待锁定池...

    JAVA上百实例源码以及开源项目源代码

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    JAVA上百实例源码以及开源项目

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

Global site tag (gtag.js) - Google Analytics