code: public static ScheduledFuture scheduleAtFixedRate(Runnable runnable, long periodInMilli) {
          /** 我们默认设定一个runnable生命周期与一个msgId一一对应 */
          Runnable proxied = wrapRunnable(runnable, null);
          return newSingleThreadScheduler().scheduleAtFixedRate(proxied, 0, periodInMilli, TimeUnit.MILLISECONDS);
      }
docs: 轻量级的定时任务执行器。 任务之间不会并行执行，任何时刻都至多只会有一个任务在执行。
  如果下一个任务执行时间已经到了，但是前一个还没有执行完毕，那么下个任务等待直到前一个执行完，然后再马上开始.
  
  @param runnable      执行的任务
  @param periodInMilli 任务启动固定间隔，单位毫秒