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

org.springframework.util.FutureUtils Maven / Gradle / Ivy

package org.springframework.util;

import java.lang.reflect.Array;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * @see org.springframework.scheduling.concurrent.ConcurrentTaskExecutor
 * @see java.util.concurrent.Executors.Executors#newSingleThreadExecutor()
 */
public class FutureUtils {
  private static final long DEFAULT_TIMEOUT = 5000L;
  private static final TimeUnit DEFAULT_TIME_UNIT = TimeUnit.MILLISECONDS;

  public static  T get(Future future) {
    return get(future, DEFAULT_TIMEOUT, DEFAULT_TIME_UNIT);
  }

  public static  T get(Future future, long timeout, TimeUnit unit) {
    try {
      return timeout < 0 ? future.get() : future.get(timeout, unit);
    }
    catch (InterruptedException | TimeoutException e) {
      future.cancel(true);
      throw new RuntimeException(e);
    }
    catch (ExecutionException e) {
      if (e.getCause() instanceof Throwable) {
        StackTraceElement[] causeStackTrace = e.getCause().getStackTrace();
        StackTraceElement[] stackTrace = e.getStackTrace();
        StackTraceElement[] stackTraceElements = (StackTraceElement[]) Array.newInstance(StackTraceElement.class, causeStackTrace.length + stackTrace.length);
        System.arraycopy(causeStackTrace, 0, stackTraceElements, 0, causeStackTrace.length);
        System.arraycopy(stackTrace, 0, stackTraceElements, causeStackTrace.length, stackTrace.length);
        e.getCause().setStackTrace(stackTraceElements);
        throw new RuntimeException(e.getCause());
      }
      throw new RuntimeException(e);
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy