java定时器task:scheduler和quartz

在javaweb项目中,经常用到定时器功能,这里介绍两个我使用过的解决方案,分别是:scheduler 和 quartz。


scheduler:
需要在spring.xml配置文件中添加关于task的配置:
<beans xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task   http://www.springframework.org/schema/task/spring-task-3.1.xsd">


<task:executor id="executor" pool-size="5" />  
    <task:scheduler id="scheduler" pool-size="10" />  
    <task:annotation-driven executor="executor" scheduler="scheduler" />
<!-- 上下两种选一个就可以,区别:标配和简配-->
    <task:annotation-driven/>


PS:和scheduler无关的我都去掉了,正式使用时需要添加完整
在java代码中,把需要定时执行的方法头部添加一行代码,如下test()是需要定时执行的:
@Scheduled(cron = "0 0 2 * * ?")//6或者7个值:秒 分 小时 天月 月天星期 年
public void test(){
long time = TimeUtil.getTodayTime();
System.out.println(long);
}


这样就可以实现了,这样做有一个弊端“如果是集群发布web服务器,就会导致每个服务器都跑一遍这个定时器,会出现定时器被多次执行”,
下面的quartz方法可以解决这个问题,quartz是用javaweb服务器和数据库等配合完成的一个定时器选择服务器执行的机制实现的,这样每次到执行的时候只选择一个合适的web服务器去执行定时任务:


在spring.xml配置文件中添加:
<bean name="dayworkReminder"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.ren.qiang.job.TestJob" />
<property name="durability" value="true" />
</bean>


<bean id="dayworkReminderTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="dayworkReminder" />
<property name="cronExpression" value="0 0 9 ? * *" />
</bean>


其中TestJob是指定需要定时执行方法的程序,在TestJob中添加的代码如下:


public class TestJob extends QuartzJobBean {


@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
TradeOrderStatisticService s = SpringContextUtils.getBean(TradeOrderStatisticService.class);
s.test();
}
}


其中test()是需要定时执行的方法。

猜你喜欢

转载自blog.csdn.net/u013276512/article/details/78686711