com.salesforce.reactivegrpc.common.ReactiveProducerStreamObserver Maven / Gradle / Ivy
/*
* Copyright (c) 2017, salesforce.com, inc.
* All rights reserved.
* Licensed under the BSD 3-Clause license.
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
*/
package com.salesforce.reactivegrpc.common;
import com.google.common.base.Preconditions;
import io.grpc.stub.ClientCallStreamObserver;
import io.grpc.stub.ClientResponseObserver;
import io.grpc.stub.StreamObserver;
import org.reactivestreams.Publisher;
/**
* LambdaStreamObserver configures client-side manual flow control for the producing end of a message stream.
*
* @param
* @param
*/
public class ReactiveProducerStreamObserver implements StreamObserver, ClientResponseObserver {
private final Publisher rxProducer;
private final Consumer onNext;
private final Consumer onError;
private final Runnable onCompleted;
private ReactivePublisherBackpressureOnReadyHandler onReadyHandler;
public ReactiveProducerStreamObserver(Publisher rxProducer, Consumer onNext, Consumer onError, Runnable onCompleted) {
this.onNext = Preconditions.checkNotNull(onNext);
this.onError = Preconditions.checkNotNull(onError);
this.onCompleted = Preconditions.checkNotNull(onCompleted);
this.rxProducer = Preconditions.checkNotNull(rxProducer);
}
@Override
public void beforeStart(ClientCallStreamObserver producerStream) {
Preconditions.checkNotNull(producerStream);
// Subscribe to the rxProducer with an adapter to a gRPC StreamObserver that respects backpressure
// signals from the underlying gRPC client transport.
onReadyHandler = new ReactivePublisherBackpressureOnReadyHandler(producerStream);
}
public void rxSubscribe() {
rxProducer.subscribe(onReadyHandler);
}
public void cancel() {
onReadyHandler.cancel();
}
@Override
public void onNext(TResponse tResponse) {
onNext.accept(tResponse);
}
@Override
public void onError(Throwable throwable) {
onError.accept(throwable);
}
@Override
public void onCompleted() {
onCompleted.run();
}
} © 2015 - 2025 Weber Informatics LLC | Privacy Policy