/**
  * Submits or schedules an {@link ApplicationTask} on the the shared executor service.
  *
  * @param <T> The task result class
  * @param applicationName The application's full name, or null to default to current application's
  *     name
  * @param code The code to execute
  * @param context The context made available to the task
  * @param delay Initial delay in milliseconds, or zero for ASAP
  * @param repeatEvery Repeat delay in milliseconds, or zero for no repetition
  * @param fixedRepeat Whether repetitions are at fixed times, or if the repeat delay begins when
  *     the task ends
  * @return A future for the task
  * @see #getExecutor()
  */
 public <T> Future<T> codeTask(
     String applicationName,
     String code,
     Object context,
     int delay,
     int repeatEvery,
     boolean fixedRepeat) {
   Application application =
       applicationName == null ? this.application : InstanceUtil.getApplication(applicationName);
   ApplicationTask<T> task = new ApplicationTask<T>(application, code, context);
   return task(task, delay, repeatEvery, fixedRepeat);
 }
  /**
   * Gets the shared executor service, creating one if it doesn't exist.
   *
   * <p>If shared globals are not set up, gets the application's executor service.
   *
   * <p>This setting can be configured by setting an attribute named <code>
   * com.threecrickets.prudence.executor</code> in the component's {@link Context}.
   *
   * @return The executor service
   */
  public ExecutorService getExecutor() {
    if (executor == null) {
      ConcurrentMap<String, Object> attributes = getSharedGlobals();

      if (attributes != null) {
        executor = (ExecutorService) attributes.get(InstanceUtil.EXECUTOR_ATTRIBUTE);

        if (executor == null) {
          executor =
              Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors() * 2 + 1);

          ExecutorService existing =
              (ExecutorService) attributes.putIfAbsent(InstanceUtil.EXECUTOR_ATTRIBUTE, executor);
          if (existing != null) executor = existing;
        }
      } else executor = InstanceUtil.getComponent().getTaskService();
    }

    return executor;
  }