Skip to content

Commit 2bbe53c

Browse files
MrRee1995RobWin
authored andcommitted
Unwrap the ExecutionException in TimeLimiter and rethrow the cause at decorateFutureSupplier function (ReactiveX#529)
1 parent 322ee78 commit 2bbe53c

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

resilience4j-timelimiter/src/main/java/io/github/resilience4j/timelimiter/TimeLimiter.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
import io.github.resilience4j.timelimiter.internal.TimeLimiterImpl;
44

55
import java.time.Duration;
6-
import java.util.concurrent.Callable;
7-
import java.util.concurrent.Future;
8-
import java.util.concurrent.TimeUnit;
9-
import java.util.concurrent.TimeoutException;
6+
import java.util.concurrent.*;
107
import java.util.function.Supplier;
118

129
/**
@@ -66,6 +63,15 @@ static <T, F extends Future<T>> Callable<T> decorateFutureSupplier(TimeLimiter t
6663
future.cancel(true);
6764
}
6865
throw e;
66+
} catch (ExecutionException e){
67+
Throwable t = e.getCause();
68+
if (t == null){
69+
throw e;
70+
}
71+
if (t instanceof Error){
72+
throw (Error) t;
73+
}
74+
throw (Exception) t;
6975
}
7076
};
7177
}

resilience4j-timelimiter/src/test/java/io/github/resilience4j/timelimiter/TimeLimiterTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,17 @@ public void shouldReturnResult() throws Exception {
7979
result = timeLimiter.decorateFutureSupplier(supplier).call();
8080
Assertions.assertThat(result).isEqualTo(42);
8181
}
82+
83+
@Test
84+
public void unwrapExecutionException() {
85+
TimeLimiter timeLimiter = TimeLimiter.ofDefaults();
86+
ExecutorService executorService = Executors.newSingleThreadExecutor();
87+
88+
Supplier<Future<Integer>> supplier = () -> executorService.submit(() -> {throw new RuntimeException();});
89+
Callable<Integer> decorated = TimeLimiter.decorateFutureSupplier(timeLimiter, supplier);
90+
91+
Try<Integer> decoratedResult = Try.ofCallable(decorated);
92+
93+
Assertions.assertThat(decoratedResult.getCause() instanceof RuntimeException).isTrue();
94+
}
8295
}

0 commit comments

Comments
 (0)