整合spring配置一个定时器。Java的TimerTask方式 网上的例子都没有考虑守护线程问题,两个任务并存问题。 在此解决了。
解决了守护线程问题(服务器结束线程跟着结束),多个任务并存问题 步骤:
新建一个定时器的配置schedulingContext-timer.xml
<!-这个bean是你的类,id随便起 -->
<bean id="todocall" class="com.forlink.hrdcx.adminWeb.shortmessagemanage.AutoSendSystem">
</bean>
<bean id="repeatingTrigger" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!--启动10秒后执行 -->
<property name="delay">
<value>10000</value>
</property>
<!--每隔20秒执行一次 -->
<property name="period">
<value>20000</value>
</property>
<!--注入要监控的javaBean -->
<property name="timerTask">
<ref bean="todocall" />
</property>
<!--设置fixedRate(这个可以不配置,这个意思是,一段时间内这个任务没执行完,就会缩短下次执行的时间) -->
<property name="fixedRate">
<value>true</value>
</property>
</bean>
<!--下面这个bean相当于java中的Timer -->
<bean id="timerFactoryBean" class="org.springframework.scheduling.timer.TimerFactoryBean">
<!--这个属性需要注意一下。这是守护线程的设置,TRUE的话就是这个是守护线程,随着服务器的关闭,线程也结束。如果没有这个属性,默认是非守护的。及时服务器关了,线程依旧运行。可能导致服务器关不掉 -->
<property name="daemon">
<value>true</value>
</property>
<property name="scheduledTimerTasks">
<list>
<!--最好一个timer控制一个timerTask,如果一个控制多个的话,可能会出问题。第二个启动后可能第一个任务会失效 -->
<ref bean="repeatingTrigger" />
</list>
</property>
</bean>
如果有多个定时任务,最好配置多个TimerFactoryBean 一个任务对应一个。
在Web.xml文件中添加如下。也可以用自启动的servlet实现。这里只要能读取定时器配置就行。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/schedulingContext-timer.xml</param-value> </context-param> <listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
Java中这样写
public class AutoSendSystem extends TimerTask
然后实现run方法就行了,在run方法中写你的操作