All Downloads are FREE. Search and download functionalities are using the official Maven repository.

br.com.objectos.way.base.util.concurrent.AbstractTimeoutScript Maven / Gradle / Ivy

There is a newer version: 2.9.0
Show newest version
/*
 * Copyright 2012 Objectos, Fábrica de Software LTDA.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package br.com.objectos.way.base.util.concurrent;

import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * @author [email protected] (Marcio Endo)
 */
public abstract class AbstractTimeoutScript extends AbstractScript {

  private final ScheduledExecutorService timeoutExecutor;

  private long timeout;
  private TimeUnit unit;

  public AbstractTimeoutScript(ExecutorService executor,
                               ScheduledExecutorService timeoutExecutor,
                               ConcurrentMap> map,
                               K key) {
    super(executor, map, key);
    this.timeoutExecutor = timeoutExecutor;

    configureTimeout();
  }

  protected void onTimeout(K key) {
  }

  protected abstract void configureTimeout();

  protected void cancelAfter(long timeout, TimeUnit unit) {
    this.timeout = timeout;
    this.unit = unit;
  }

  @Override
  void postSubmit(K key, Future future) {
    TimeoutTask task = new TimeoutTask(key, future, this);
    timeoutExecutor.schedule(task, timeout, unit);
  }

  private static class TimeoutTask implements Runnable {

    private final K key;

    private final Future future;

    private final AbstractTimeoutScript script;

    public TimeoutTask(K key, Future future, AbstractTimeoutScript script) {
      this.key = key;
      this.future = future;
      this.script = script;
    }

    @Override
    public void run() {
      if (!future.isDone()) {
        tryToCancel();
      }
    }

    private void tryToCancel() {
      try {
        script.onTimeout(key);
        script.cancel();
        script.onError(key,
            new TimeoutException("Script took longer than maximum allowed time for completion."));
      } finally {
        script.finish();
      }
    }

  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy