@Test
public void retryFailedMessages() throws InterruptedException {
TopicPartition topicKey = new TopicPartition(TOPIC, PARTITION);
TypeDictionary typeDictionary = new TestTypeDictionary();
class RetryableTestException extends RuntimeException {
}
class RetryTestFailureHandler extends DelayAndRetryOnRecoverableErrors {
public RetryTestFailureHandler(FailedMessageProcessor fallbackStrategy, RetryDelayer retryStrategy) {
super(fallbackStrategy, retryStrategy);
}
@Override
protected boolean isRecoverable(Throwable failureCause) {
if (failureCause instanceof RetryableTestException) {
return true;
}
return super.isRecoverable(failureCause);
}
}
FailedMessageProcessor failedMessageProcessor = new RetryTestFailureHandler(new DiscardFailedMessages(), new SimpleRetryDelayer(10, 100));
PartitionProcessor processor = new PartitionProcessor(topicKey, typeDictionary, failedMessageProcessor, null, null);
getTestHandler(processor).exceptionToBeThrown = new RetryableTestException();
processor.enqueue(testRecordWithOffset(42));
getTestHandler(processor).blockReturnFromOnMessage.countDown();
getTestHandler(processor).handlerReturnedNormally.await();
processor.waitForHandlersToTerminate(100);
assertEquals(2, getTestHandler(processor).nbHandlerInvokations.get());
assertTrue(processor.hasUncommittedMessages());
assertEquals(43, processor.getCommitOffsetAndClear());
}