use of com.couchbase.client.core.retry.reactor.Retry in project couchbase-jvm-clients by couchbase.
the class ClusterManagerBucketRefresher method registerStream.
/**
* Registers the given bucket name with the http stream.
*
* <p>Note that this method deliberately subscribes "out of band" and not being flatMapped into the
* {@link #register(String)} return value. The idea is that the flux config subscription keeps on going
* forever until specifically unsubscribed through either {@link #deregister(String)} or {@link #shutdown()}.</p>
*
* @param ctx the core context to use.
* @param name the name of the bucket.
* @return once registered, returns the disposable so it can be later used to deregister.
*/
private Disposable registerStream(final CoreContext ctx, final String name) {
return Mono.defer(() -> {
BucketConfigStreamingRequest request = new BucketConfigStreamingRequest(ctx.environment().timeoutConfig().managementTimeout(), ctx, BestEffortRetryStrategy.INSTANCE, name, ctx.authenticator());
core.send(request);
return Reactor.wrap(request, request.response(), true);
}).flux().flatMap(res -> {
if (res.status().success()) {
return res.configs().map(config -> new ProposedBucketConfigContext(name, config, res.address()));
} else {
eventBus.publish(new BucketConfigRefreshFailedEvent(core.context(), BucketConfigRefreshFailedEvent.RefresherType.MANAGER, BucketConfigRefreshFailedEvent.Reason.INDIVIDUAL_REQUEST_FAILED, Optional.of(res)));
// and retry the whole thing
return Flux.error(new ConfigException());
}
}).doOnError(e -> eventBus.publish(new BucketConfigRefreshFailedEvent(core.context(), BucketConfigRefreshFailedEvent.RefresherType.MANAGER, BucketConfigRefreshFailedEvent.Reason.STREAM_FAILED, Optional.of(e)))).doOnComplete(() -> {
eventBus.publish(new BucketConfigRefreshFailedEvent(core.context(), BucketConfigRefreshFailedEvent.RefresherType.MANAGER, BucketConfigRefreshFailedEvent.Reason.STREAM_CLOSED, Optional.empty()));
// handled in the retryWhen below.
throw new ConfigException();
}).retryWhen(Retry.any().exponentialBackoff(Duration.ofMillis(32), Duration.ofMillis(4096)).toReactorRetry()).subscribe(provider::proposeBucketConfig);
}
Aggregations