java-分布式任务调度的两种方式


在以往的项目开发中,分布式任务调度从 代码控制 到数据库 控制的过渡。。。。。

第一种方式:扩展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 

      原文详细,不再赘述

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM