Java.util.Timer的灵活配置与使用


需求:定时器可以进行实时开关、运行时间的调整操作,且需要部署在分布式环境下。

解决方案:

  1、配置灵活性:

    使用servlet对目前所有的定时器进行初始化,与时间配置一起保存在servlet的static字段中。

    这样就可以根据用户的配置,对内存中的定时器及其时间配置进行灵活操作。

  2、分布式环境下的数据一致性问题:

    ① 创建分布式排他锁,对同一时间段内的多个节点的请求进行互斥。

    ② 每个定时器任务执行之前都需要同步数据库时间配置,一旦发现配置变动,即进行相应的配置变动,保持与数据库的配置同步。

     任务执行完毕之后,timer休眠10分钟,防止节点之间时钟差异,相同任务重复执行的问题。

    ④ servlet的destroy方法中清除所有定时器。

关键代码:

  // 创建每天特定时间执行的定时器:

  Timer timer = new Timer();

  Date taskDate = getDate("12");

  timer.schedule(new XXXTask(), taskDate, 24*60*60*1000); // 每天特定时间执行任务

  // 获取特定时间的Date类

  public Date getDate(String executeTime) {

    int hour = Integer.parseInt();

    Calendar calendar = Calendar.getInstance();

    int year = calendar.get(Calendar.YEAR);

    int month = calendar.get(Calendar.MONTH);

    int day = calendar.get(Calendar.DAY);

    calendar.set(year, month, day, hour, 00, 00);

    Date taskDate = calendar.getTime();

    if (taskDate.before(new Date)) {

      // 将时间设置为明天

      calendar.add(Calendar.DATE, 1);

      taskDate = calendar.getTime();

    }

    return taskDate;

  }

相关