`
Josh_Persistence
  • 浏览: 1653474 次
  • 性别: 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也可以试试

相关推荐

    quartz 随tomcat启动执行一次

    ### 关于 Quartz 随 Tomcat 启动执行一次的知识点 #### 1. Quartz 概述 Quartz 是一个开源的作业调度框架,能够触发在指定时间执行的任务(也称为作业)。它提供了丰富的调度器功能,如支持复杂的循环调度、支持...

    Tomcat启动顺序

    【标题】:Tomcat启动顺序 【描述】:Tomcat作为Apache软件基金会的开源Java Servlet容器,其启动过程是理解其工作原理的关键部分。Tomcat的启动顺序涉及到多个层次的加载,从Bootstrap类开始,逐步加载系统配置、...

    命令行启动关闭tomcat而不显示cmd界面

    标题中的“命令行启动关闭tomcat而不显示cmd界面”指的是在Windows操作系统中,通过命令行启动和关闭Apache Tomcat服务器,但不希望看到通常伴随命令行执行而出现的CMD窗口。这种方式可以使得桌面更加整洁,同时也...

    tomcat设置开机自启动.docx

    在本文中,我们将设置 Tomcat 的自动启动时间为“每次开机后”,以便在系统启动时自动启动 Tomcat 服务。 知识点 4: 设置 Tomcat 的启动文件 在设置 Tomcat 的自动启动时,需要指定 Tomcat 的启动文件 bat。用户...

    Tomcat开机自启动

    "Tomcat开机自启动" Tomcat开机自启动是指在 Linux 操作系统中,使 Tomcat 服务器在系统启动时自动启动的过程。...在本文中,我们介绍了 Tomcat 开机自启动的步骤和相关知识点,为读者提供了一个详细的指南。

    内嵌式tomcat启动web工程

    在本教程中,我们将深入探讨如何使用Maven来配置和启动一个内嵌式的Tomcat服务器,以便运行Web工程。 首先,我们需要在项目中添加Tomcat内嵌库。在Maven的`pom.xml`文件中,我们需要引入`tomcat7-maven-plugin`或`...

    Ant编译Tomcat源码、MyEclipse导入Tomcat源码、执行Tomcat源码启动Tomcat

    Ant是一个基于XML的构建工具,而Tomcat则是一个流行的开源Servlet容器。本篇将详细介绍如何使用Ant编译Tomcat源码,以及如何在MyEclipse环境中导入并运行Tomcat源码。 首先,Ant是Apache软件基金会开发的Java项目...

    tomcat不能启动的原因总结

    **问题描述**:系统环境变量配置不当导致Tomcat启动失败。 **解决方法**:检查并确认`JAVA_HOME`和`CATALINA_HOME`等环境变量是否正确配置。确保指向正确的JDK和Tomcat安装路径。 ##### 4. 多个Tomcat版本共存 **...

    Linux 配置 tomcat 开机启动.txt

    - 先调用 `stop()` 函数停止 Tomcat,等待 1 秒后再调用 `start()` 函数重新启动 Tomcat。 5. **主逻辑控制**: - 通过分析传入的第一个参数 `$1` 来判断用户想要执行的操作(`start`, `stop`, 或 `restart`)。 ...

    tomcat自启动

    然而,默认情况下,Tomcat并不会随着系统启动而自动运行,这对于服务器管理和运维来说是一个不便。因此,实现Tomcat的自启动成为许多开发者和运维人员追求的目标。本文将详细阐述如何让解压缩版的Tomcat在系统启动时...

    linux 启动 Tomcat 命令

    在Linux环境下部署与管理Java Web应用程序时,Apache Tomcat服务器作为最常用的轻量级应用容器之一,其启动与停止命令是运维人员必须掌握的基本技能。本文将详细介绍如何在Linux系统中启动Tomcat服务器,并解释相关...

    tomcat6启动脚本

    7. 修改`/etc/init.d/`目录下的启动脚本,比如创建一个名为`tomcat`的文件,将`Tomcat5.sh`的内容复制过去。 8. 为脚本添加执行权限:`chmod +x tomcat`。 为了使Tomcat能够以特定用户(如`tomcat`)运行,并避免...

    apache-tomcat-7.0.79

    安装完成后,你将能够在指定的目录下找到Tomcat的解压文件,包括`bin`目录下的可执行文件(如`catalina.bat`和`startup.bat`)、`conf`目录下的配置文件、`webapps`目录用于部署应用程序,以及`logs`和`temp`目录...

    Tomcat停止与启动shell

    标题 "Tomcat停止与启动shell" 指的是一个用于管理Tomcat服务器的脚本,通常这个`restart.sh`文件是用来自动化Tomcat服务的启动和停止操作的。Tomcat是Apache软件基金会的一个开源项目,是一个广泛使用的Java ...

    apache-tomcat-7.0.39

    Apache Tomcat 7.0.39 是一个广泛使用的开源软件,主要作为Java Servlet和JavaServer Pages(JSP)的容器。它实现了Sun Microsystems(现为Oracle)制定的Java EE Web Profile规范,允许开发者在不依赖完整应用...

    Linux操作系统下两种自动启动Tomcat的方法

    然而,这种方法的缺点在于它不能指定启动Tomcat服务的用户,可能导致Tomcat以root用户运行,这是一个严重的安全风险,因为如果Tomcat被攻击,攻击者将拥有root权限。 为了克服上述问题,我们需要采用更复杂但专业的...

    tomcat启动和关闭

    标题中的“Tomcat启动和关闭”是指在Apache Tomcat服务器中进行服务的启停操作,这是每个Java Web开发者必备的基础技能。Apache Tomcat是一个开源的Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范...

    linux下启动多tomcat

    在Linux环境下启动多个Tomcat服务器是一项常见的需求,尤其是在开发、测试或生产环境中,为了实现不同应用的隔离或者负载均衡,企业级项目往往需要部署多个独立的Tomcat实例。以下将详细解析如何在Linux系统中成功...

    tomcat设置开机自启动介绍

    例如,在一个24/7运营的网站中,如果Tomcat没有设置为开机自启动,一旦服务器重启,网站将无法访问,直到有人手动启动Tomcat服务,这无疑增加了故障恢复时间和潜在的业务损失。 ### 设置步骤详解 #### 步骤一:...

Global site tag (gtag.js) - Google Analytics