java定時器task:scheduler和quartz
阿新 • • 發佈:2018-11-26
在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()是需要定時執行的方法。
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="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()是需要定時執行的方法。