@Override
 public BoundaryCronTrigger create(TimeInterval frequency, Schedule schedule, TimeSpan window) {
   if (frequency.getMilliseconds() % 15 * DateUtils.MILLIS_PER_SECOND != 0) {
     throw new IllegalArgumentException(
         "The frequency " + frequency + " can't be divided by system minimal interval(15s)");
   }
   int pos, val;
   String interval = frequency.getInterval();
   if (interval.contains("h")) {
     pos = 2;
     val = Integer.valueOf(interval.substring(0, interval.indexOf('h')));
   } else if (interval.contains("m")) {
     pos = 1;
     val = Integer.valueOf(interval.substring(0, interval.indexOf('m')));
   } else if (interval.contains("s")) {
     pos = 0;
     val = Integer.valueOf(interval.substring(0, interval.indexOf('s')));
   } else {
     throw new IllegalArgumentException(
         "The interval " + interval + " is invalid, we only support h/m/s");
   }
   // 如果连系统都没有设置默认的监控的频度,那么我们默认设置为所有时间
   String[] cron =
       schedule == null
           ? new String[] {"*", "*", "*", "*", "*", "*"}
           : schedule.getCron().split("\\s");
   Granularity granularity = getGranularity(frequency);
   // 不同的频度,还需要削峰填谷
   // 在频度之前的每个字段,先归置为0
   for (int i = 0; i < pos; i++) {
     cron[i] = granularity.getSegment(i);
   }
   // 在小时这里,schedule和frequency的偏移量可能出现冲突
   // 原则是,保留 schedule的限制
   cron[pos] = granularity.getSegment(pos) + "/" + val;
   // 向上计数,下个该间隔的计划自然向上偏移
   granularity.stepUp();
   String expression = StringUtils.join(cron, " ");
   BoundaryCronTrigger trigger = new BoundaryCronTrigger(expression);
   trigger.include(schedule);
   trigger.exclude(window);
   return trigger;
 }
  public Collection<String> getPathsForInterval(ReadableInterval interval) {
    final List<String> paths = new ArrayList<String>();

    granularity.stepThroughInterval(
        interval,
        new Granularity.Callback<RuntimeException>() {
          public void step(ReadableInterval stepInterval) throws RuntimeException {
            paths.add(getPathForDateTime(stepInterval.getStart()));
          }
        });

    return paths;
  }
 public String getPathForDateTime(ReadableDateTime dateTime) {
   return String.format("%s/%s", prefix, granularity.getRelativePathFor(dateTime));
 }