use of io.camunda.zeebe.util.exception.RecoverableException in project zeebe by camunda.
the class StreamProcessorTest method shouldRetryProcessingRecordOnRecoverableException.
@Test
public void shouldRetryProcessingRecordOnRecoverableException() {
// given
final TypedRecordProcessor<?> typedRecordProcessor = mock(TypedRecordProcessor.class);
final AtomicInteger count = new AtomicInteger(0);
doAnswer((invocationOnMock -> {
if (count.getAndIncrement() == 0) {
throw new RecoverableException("recoverable");
}
return null;
})).when(typedRecordProcessor).processRecord(anyLong(), any(), any(), any(), any());
streamProcessorRule.startTypedStreamProcessor((processors, state) -> processors.onCommand(ValueType.PROCESS_INSTANCE, ProcessInstanceIntent.ACTIVATE_ELEMENT, typedRecordProcessor));
// when
final long position = streamProcessorRule.writeCommand(ProcessInstanceIntent.ACTIVATE_ELEMENT, PROCESS_INSTANCE_RECORD);
// then
final InOrder inOrder = inOrder(typedRecordProcessor);
inOrder.verify(typedRecordProcessor, TIMEOUT.times(1)).onRecovered(any());
inOrder.verify(typedRecordProcessor, TIMEOUT.times(2)).processRecord(eq(position), any(), any(), any(), any());
inOrder.verifyNoMoreInteractions();
}
use of io.camunda.zeebe.util.exception.RecoverableException in project zeebe by camunda.
the class ZeebeRocksDbTransactionTest method shouldReThrowRecoverableExceptionInTransactionRun.
@Test(expected = RecoverableException.class)
public void shouldReThrowRecoverableExceptionInTransactionRun() throws Exception {
// given
final Status status = new Status(Code.IOError, SubCode.None, "");
// when
final ZeebeDbTransaction currentTransaction = transactionContext.getCurrentTransaction();
currentTransaction.run(() -> {
throw new RecoverableException(new RocksDBException("expected", status));
});
}
use of io.camunda.zeebe.util.exception.RecoverableException in project zeebe by camunda.
the class RecoverableRetryStrategyTest method shouldRetryOnException.
@Test
public void shouldRetryOnException() throws Exception {
// given
final AtomicInteger count = new AtomicInteger(0);
final AtomicBoolean toggle = new AtomicBoolean(false);
// when
actorControl.run(() -> {
resultFuture = recoverableRetryStrategy.runWithRetry(() -> {
toggle.set(!toggle.get());
if (toggle.get()) {
throw new RecoverableException("expected");
}
return count.incrementAndGet() == 10;
});
});
schedulerRule.workUntilDone();
// then
assertThat(count.get()).isEqualTo(10);
assertThat(resultFuture.isDone()).isTrue();
assertThat(resultFuture.get()).isTrue();
}
use of io.camunda.zeebe.util.exception.RecoverableException in project zeebe by zeebe-io.
the class ZeebeRocksDbTransactionTest method shouldReThrowRecoverableException.
@Test(expected = RecoverableException.class)
public void shouldReThrowRecoverableException() {
// given
final Status status = new Status(Code.IOError, SubCode.None, "");
// when
transactionContext.runInTransaction(() -> {
throw new RecoverableException(new RocksDBException("expected", status));
});
}
use of io.camunda.zeebe.util.exception.RecoverableException in project zeebe by zeebe-io.
the class StreamProcessorTest method shouldRetryProcessingRecordOnRecoverableException.
@Test
public void shouldRetryProcessingRecordOnRecoverableException() {
// given
final TypedRecordProcessor<?> typedRecordProcessor = mock(TypedRecordProcessor.class);
final AtomicInteger count = new AtomicInteger(0);
doAnswer((invocationOnMock -> {
if (count.getAndIncrement() == 0) {
throw new RecoverableException("recoverable");
}
return null;
})).when(typedRecordProcessor).processRecord(anyLong(), any(), any(), any(), any());
streamProcessorRule.startTypedStreamProcessor((processors, state) -> processors.onCommand(ValueType.PROCESS_INSTANCE, ProcessInstanceIntent.ACTIVATE_ELEMENT, typedRecordProcessor));
// when
final long position = streamProcessorRule.writeCommand(ProcessInstanceIntent.ACTIVATE_ELEMENT, PROCESS_INSTANCE_RECORD);
// then
final InOrder inOrder = inOrder(typedRecordProcessor);
inOrder.verify(typedRecordProcessor, TIMEOUT.times(1)).onRecovered(any());
inOrder.verify(typedRecordProcessor, TIMEOUT.times(2)).processRecord(eq(position), any(), any(), any(), any());
inOrder.verifyNoMoreInteractions();
}
Aggregations