У меня есть приведенный ниже простой класс повтора. Этот класс будет повторять данное обещание несколько раз (retryCount) с заданной задержкой (delay), если он преуспевает в пределах счетчика повторных попыток, он проходит, иначе он терпит неудачу.
public class SimpleRetry {
private final Vertx vertx;
public SimpleRetry(Vertx vertx) {
this.vertx = vertx;
}
public <T> Promise<T> retryWithDelay(Promise<T> promise, int retryCount, int delay, TimeUnit unit) {
log.debug("Retrying operation with : " + retryCount + " retry count and delay of " + delay);
return execute(promise, retryCount, delay, unit);
}
private <T> Promise<T> execute(Promise<T> promise, int count, int delay, TimeUnit unit) {
Promise<T> newPromise = Promise.promise();
if (count > 0) {
promise.future().onComplete(handler -> {
if (handler.succeeded()) {
log.debug("Retry operation successful");
newPromise.complete(handler.result());
} else {
log.debug("Operation failed, hence retrying again..");
if (delay > 0) {
vertx.setTimer(unit.toMillis(delay), id -> execute(promise, count - 1, delay, unit));
} else {
execute(promise, count - 1, delay, unit);
}
}
});
} else {
log.debug("Retry count exceeded, hence failing the promise..");
newPromise.fail("Retry count exceeded!.");
}
return newPromise;
}
Написано приведенный ниже тестовый пример, чтобы проверить это. Но это не выполняется. вместо этого истекает время ожидания.
@RunWith(VertxUnitRunner.class)
public class SimpleRetryTests {
private SimpleRetry simpleRetry;
private Vertx vertx;
private static int count;
@Before
public void setUp(TestContext context){
vertx = Vertx.vertx();
simpleRetry = new SimpleRetry(vertx);
count = 0;
context.asyncAssertSuccess();
}
@Test
public void testSimpleRetryWhichPassesOnFirstTry(TestContext context){
final Async async = context.async();
simpleRetry.retryWithDelay(dummyPromise(1), 10, 10, TimeUnit.MILLISECONDS)
.future().onSuccess(res -> {
System.out.println("Promise completed");
context.asyncAssertSuccess();
async.complete();
}).onFailure(ex -> {
System.out.println("Promise failed : " + ex);
context.asyncAssertFailure();
async.complete();
});
}
//A dummy promise which only passes when called 5 times.
private Promise<Void> dummyPromise(int passCount){
Promise<Void> promise = Promise.promise();
vertx.setTimer(10, id->{
count++;
if(count == passCount) {
promise.complete();
} else {
promise.fail("Error!!");
}
});
return promise;
}
@After
public void tearDown(TestContext context){
simpleRetry = null;
vertx.close(context.asyncAssertSuccess());
}
}
Что я делаю не так? Заранее спасибо.