I am using the new Couchbase Java Client API 2.1.1 and therefore JavaRx to access my Couchbase cluster.
When using asynchronous getAndLock
on an already locked document, getAndLock fails with a TemporaryLockFailureException
. In another SO question (rxjava: Can I use retry() but with delay?) I found out how to retry with delay.
Here is my adopted code:
CountDownLatchWithResultData<JsonDocument> resultCdl = new CountDownLatchWithResultData<>(1);
couchbaseBucket.async().getAndLock(key, LOCK_TIME).retryWhen((errorObserver) -> {
return errorObserver.flatMap((Throwable t) -> {
if (t instanceof TemporaryLockFailureException) {
return Observable.timer(RETRY_DELAY_MS, TimeUnit.MILLISECONDS);
}
return Observable.error(t);
});
}).subscribe(new Subscriber<JsonDocument>() {
@Override
public void onCompleted() {
resultCdl.countDown();
}
@Override
public void onError(Throwable e) {
resultCdl.countDown();
}
@Override
public void onNext(JsonDocument t) {
resultCdl.setInformation(t);
}
});
........
resultCdl.await();
if (resultCdl.getInformation() == null) {
//do stuff
} else ....
(CountDownLatchWithResultData
simply extends a normal CountDownLatch
and adds two methods to store some information before the count has reached 0 and retrieve it afterwards)
So basically I'd like this code to
- try to get the lock infinitely once every
RETRY_DELAY_MS
milliseconds if aTemporaryLockFailureException
occured and then callonNext
- or to fail completely on other exceptions
- or to directly call
onNext
if there is no exception at all
The problem now is that when retrying, it only retries once and the JsonDocument from resultCdl.getInformation()
is always null in this case even though the document exists. It seems onNext
is never called.
If there is no exception, the code works fine.
So apparently I am doing something wrong here but I have no clue as to where the problem might be. Does returning Observable.timer
imply that with this new Obervable also the previously associated retryWhen
is executed again? Is it the CountDownLatch
with count 1 getting in the way?