首页 > 代码库 > java-分布式任务调度的两种方式

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     @Override28     public void setCronExpression(String cronExpression) throws ParseException {29         String localIp = "";//TODO ..这里是获取本地ip 的一种方式,内网或者外网,都可以,只要统一就ok30         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 

      原文详细,不再赘述

 

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