`
LiYunpeng
  • 浏览: 938359 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Tomcat不影响启动时间 启动完成后执行一个操作的实现方法

阅读更多
关于Tomcat启动后台服务时候,在不影响启动时间的情况下,启动完成执行一个操作

主要思路是对后台进行一些初始化操作
但是,有可能初始化操作的时间长度是不可控的,甚至可能是在循环的操作
所以试过了如下方法是不太合适的
如:
1.配置一个Servlet默认自动启动
2.配置一个Listener来启动
3.实现Spring的InitializingBean接口
但是,这三种方法,都是伴随着Tomcat来启动的,也就是占用Tomcat的启动时间

以上是伴随启动的方法
以下是不影响Tomcat启动的并行方法

其实考虑到伴随启动,就想到了Flex开发通常用到的异步调用
无非就是新创建了一个线程来单独执行,这样Tomcat执行到相应的操作就可以直接继续下去了,不会处于等待的状态,避免了启动超时

具体思路如下
1.创建新的线程去执行(本方法没有实际实验,本文记录的是第二种方法,使用Quartz)
2.使用Quartz来配置一个任务执行
具体配置如下
实现Job接口的任务实现类
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配置文件中配置的任务
<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>
	<!--定时器任务配置(结束)-->

以上的配置不详细说明了,不明白意思的属性可以去API文档中查询
http://www.quartz-scheduler.org/api/1.8.5/

这里需要注意的一点就是Job的实现,是必须重写execute方法的,可是我反复实验,在targetMethod的value中写execute,就会报错,找不到execute方法,后来想了想,可能是参数的问题
copy了原来的方法,于是去掉了参数,就好用了
----------------------------

另外,再记录一个关于Quartz两种配置JobDetail的方法,直接在代码中创建JobDetail,会无法注入相应的接口实现,在稍后的博客中介绍
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics