在以往的項目開發中,分布式任務調度從 代碼控制 到數據庫 控制的過渡。。。。。
第一種方式:擴展spring 的 CronTriggerBean,將 屬性注入進去
先來看一段代碼:
1 package com.lixiaodao.task.quartz; 2 3 import java.text.ParseException; 4 import java.util.Map; 5 6 import org.slf4j.Logger; 7 import org.slf4j.LoggerFactory; 8 import org.springframework.scheduling.quartz.CronTriggerBean; 9 10 import com.lixiaodao.utils.DateUtil; 11 import com.lixiaodao.utils.StrUtils; 12 13 public class LixiaodaoCronTriggerBean extends CronTriggerBean{ 14 15 private static final long serialVersionUID = 4625482606892589275L; 16 17 private static final Logger logger = LoggerFactory.getLogger(LixiaodaoCronTriggerBean.class); 18 19 private Map<String, String> cronExpressionMap; 20 21 private static final String TEN_YEAR_LATER = DateUtil.date2String(DateUtil.rollByYear(10), DateUtil.SDF_YYYY); 22 private static final String NOT_EXCUTE = "0 0 0 1 1 ? " + TEN_YEAR_LATER; /**設定一個10年后的時間,只要服務器10年內重啟,定時任務就不會執行**/ 23 24 /** 25 * 重寫 父類的方法 26 */ 27 @Override 28 public void setCronExpression(String cronExpression) throws ParseException { 29 String localIp = "";//TODO ..這里是獲取本地ip 的一種方式,內網或者外網,都可以,只要統一就ok 30 cronExpression = ""; 31 if(cronExpressionMap != null){ 32 cronExpression = cronExpressionMap.get(localIp); 33 } 34 if(StrUtils.isBlank(cronExpression)){ 35 cronExpression = NOT_EXCUTE; 36 } 37 logger.debug("{} 使用 定時 {}",new Object[]{localIp,cronExpression}); 38 super.setCronExpression(cronExpression); 39 } 40 41 }
再看配置:(黃色部分)
1)自己擴展
2)配置文件注入 <ip,執行周期鍵值對>
如此就可以實現,多台服務器(不同ip),相同的配置文件下,不同的服務器調度不同的任務了
1 <bean id="runTask" class="com.lixiaodao.task.quartz.LixiaodaoCronTriggerBean"> 2 <property name="jobDetail"> 3 <bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 4 <property name="targetObject" ref="adminUserService"/> 5 <property name="targetMethod" value="clearPublishCount"/> 6 <property name="concurrent" value="false"/> 7 </bean> 8 </property> 9 <property name="cronExpressionMap"> 10 <map> 11 <entry key="10.4.7.78" value="0 0 0 * * ?"/> 12 <entry key="10.4.3.180" value="0 2 0 * * ?"/> 13 </map> 14 </property> 15 </bean>
第二種方式: 用 quartz 提供的數據庫 實現方式,實現分布式任務調度
具體參見:http://blog.csdn.net/zxl315/article/details/10830105
原文詳細,不再贅述