use of cn.taketoday.retry.RetryCallback in project today-framework by TAKETODAY.
the class StatefulRecoveryRetryTests method testCacheCapacityNotReachedIfRecovered.
@Test
public void testCacheCapacityNotReachedIfRecovered() throws Throwable {
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(1);
this.retryTemplate.setRetryPolicy(retryPolicy);
this.retryTemplate.setRetryContextCache(new MapRetryContextCache(2));
final StringHolder item = new StringHolder("foo");
RetryState state = new DefaultRetryState(item);
RetryCallback<Object, Exception> callback = new RetryCallback<Object, Exception>() {
@Override
public Object doWithRetry(RetryContext context) throws Exception {
StatefulRecoveryRetryTests.this.count++;
throw new RuntimeException("Barf!");
}
};
RecoveryCallback<Object> recoveryCallback = new RecoveryCallback<Object>() {
@Override
public Object recover(RetryContext context) throws Exception {
return null;
}
};
try {
this.retryTemplate.execute(callback, recoveryCallback, state);
fail("Expected RuntimeException");
} catch (RuntimeException e) {
assertEquals("Barf!", e.getMessage());
}
this.retryTemplate.execute(callback, recoveryCallback, state);
RetryContext context = this.retryTemplate.open(retryPolicy, state);
// True after exhausted - the history is reset...
assertEquals(0, context.getRetryCount());
}
use of cn.taketoday.retry.RetryCallback in project today-framework by TAKETODAY.
the class StatefulRecoveryRetryTests method testKeyGeneratorNotConsistentAfterFailure.
@Test
public void testKeyGeneratorNotConsistentAfterFailure() throws Throwable {
RetryPolicy retryPolicy = new SimpleRetryPolicy(3);
this.retryTemplate.setRetryPolicy(retryPolicy);
final StringHolder item = new StringHolder("bar");
RetryState state = new DefaultRetryState(item);
RetryCallback<StringHolder, Exception> callback = new RetryCallback<StringHolder, Exception>() {
@Override
public StringHolder doWithRetry(RetryContext context) throws Exception {
// This simulates what happens if someone uses a primary key
// for hashCode and equals and then relies on default key
// generator
item.string = item.string + (StatefulRecoveryRetryTests.this.count++);
throw new RuntimeException("Barf!");
}
};
try {
this.retryTemplate.execute(callback, state);
fail("Expected RuntimeException");
} catch (RuntimeException ex) {
String message = ex.getMessage();
assertEquals("Barf!", message);
}
// item already...
try {
this.retryTemplate.execute(callback, state);
fail("Expected RetryException");
} catch (RetryException ex) {
String message = ex.getNestedMessage();
assertTrue("Message doesn't contain 'inconsistent': " + message, message.contains("inconsistent"));
}
RetryContext context = this.retryTemplate.open(retryPolicy, state);
// True after exhausted - the history is reset...
assertEquals(0, context.getRetryCount());
}
use of cn.taketoday.retry.RetryCallback in project today-framework by TAKETODAY.
the class StatefulRecoveryRetryTests method testCacheCapacity.
@Test
public void testCacheCapacity() throws Throwable {
this.retryTemplate.setRetryPolicy(new SimpleRetryPolicy(1));
this.retryTemplate.setRetryContextCache(new MapRetryContextCache(1));
RetryCallback<Object, Exception> callback = context -> {
StatefulRecoveryRetryTests.this.count++;
throw new RuntimeException("Barf!");
};
try {
this.retryTemplate.execute(callback, new DefaultRetryState("foo"));
fail("Expected RuntimeException");
} catch (RuntimeException e) {
assertEquals("Barf!", e.getMessage());
}
try {
this.retryTemplate.execute(callback, new DefaultRetryState("bar"));
fail("Expected RetryException");
} catch (RetryException e) {
String message = e.getNestedMessage();
assertTrue("Message does not contain 'capacity': " + message, message.contains("capacity"));
}
}
use of cn.taketoday.retry.RetryCallback in project today-infrastructure by TAKETODAY.
the class StatefulRecoveryRetryTests method testKeyGeneratorNotConsistentAfterFailure.
@Test
public void testKeyGeneratorNotConsistentAfterFailure() throws Throwable {
RetryPolicy retryPolicy = new SimpleRetryPolicy(3);
this.retryTemplate.setRetryPolicy(retryPolicy);
final StringHolder item = new StringHolder("bar");
RetryState state = new DefaultRetryState(item);
RetryCallback<StringHolder, Exception> callback = new RetryCallback<StringHolder, Exception>() {
@Override
public StringHolder doWithRetry(RetryContext context) throws Exception {
// This simulates what happens if someone uses a primary key
// for hashCode and equals and then relies on default key
// generator
item.string = item.string + (StatefulRecoveryRetryTests.this.count++);
throw new RuntimeException("Barf!");
}
};
try {
this.retryTemplate.execute(callback, state);
fail("Expected RuntimeException");
} catch (RuntimeException ex) {
String message = ex.getMessage();
assertEquals("Barf!", message);
}
// item already...
try {
this.retryTemplate.execute(callback, state);
fail("Expected RetryException");
} catch (RetryException ex) {
String message = ex.getNestedMessage();
assertTrue("Message doesn't contain 'inconsistent': " + message, message.contains("inconsistent"));
}
RetryContext context = this.retryTemplate.open(retryPolicy, state);
// True after exhausted - the history is reset...
assertEquals(0, context.getRetryCount());
}
use of cn.taketoday.retry.RetryCallback in project today-infrastructure by TAKETODAY.
the class StatefulRecoveryRetryTests method testRecover.
@Test
public void testRecover() throws Throwable {
this.retryTemplate.setRetryPolicy(new SimpleRetryPolicy(1));
final String input = "foo";
RetryState state = new DefaultRetryState(input);
RetryCallback<String, Exception> callback = new RetryCallback<String, Exception>() {
@Override
public String doWithRetry(RetryContext context) throws Exception {
throw new RuntimeException("Barf!");
}
};
RecoveryCallback<String> recoveryCallback = new RecoveryCallback<String>() {
@Override
public String recover(RetryContext context) {
StatefulRecoveryRetryTests.this.count++;
StatefulRecoveryRetryTests.this.list.add(input);
return input;
}
};
Object result = null;
try {
result = this.retryTemplate.execute(callback, recoveryCallback, state);
fail("Expected exception on first try");
} catch (Exception e) {
// expected...
}
// On the second retry, the recovery path is taken...
result = this.retryTemplate.execute(callback, recoveryCallback, state);
// default result is the item
assertEquals(input, result);
assertEquals(1, this.count);
assertEquals(input, this.list.get(0));
}
Aggregations