mirror of https://github.com/grpc/grpc-java.git
parent
bb737a2e31
commit
2ca28a2903
|
|
@ -16,8 +16,6 @@
|
||||||
|
|
||||||
package io.grpc.stub;
|
package io.grpc.stub;
|
||||||
|
|
||||||
import io.grpc.ExperimentalApi;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -30,7 +28,6 @@ import javax.annotation.Nullable;
|
||||||
* <p>DO NOT MOCK: The API is too complex to reliably mock. Use InProcessChannelBuilder to create
|
* <p>DO NOT MOCK: The API is too complex to reliably mock. Use InProcessChannelBuilder to create
|
||||||
* "real" RPCs suitable for testing and make a fake for the server-side.
|
* "real" RPCs suitable for testing and make a fake for the server-side.
|
||||||
*/
|
*/
|
||||||
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1788")
|
|
||||||
public abstract class ClientCallStreamObserver<V> extends CallStreamObserver<V> {
|
public abstract class ClientCallStreamObserver<V> extends CallStreamObserver<V> {
|
||||||
/**
|
/**
|
||||||
* Prevent any further processing for this {@code ClientCallStreamObserver}. No further messages
|
* Prevent any further processing for this {@code ClientCallStreamObserver}. No further messages
|
||||||
|
|
@ -57,10 +54,60 @@ public abstract class ClientCallStreamObserver<V> extends CallStreamObserver<V>
|
||||||
*
|
*
|
||||||
* <p>This method may only be called during {@link ClientResponseObserver#beforeStart
|
* <p>This method may only be called during {@link ClientResponseObserver#beforeStart
|
||||||
* ClientResponseObserver.beforeStart()}.
|
* ClientResponseObserver.beforeStart()}.
|
||||||
*
|
|
||||||
* <p>This API is still a work in-progress and may change in the future.
|
|
||||||
*/
|
*/
|
||||||
public void disableAutoRequestWithInitial(int request) {
|
public void disableAutoRequestWithInitial(int request) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If {@code true}, indicates that the observer is capable of sending additional messages
|
||||||
|
* without requiring excessive buffering internally. This value is just a suggestion and the
|
||||||
|
* application is free to ignore it, however doing so may result in excessive buffering within the
|
||||||
|
* observer.
|
||||||
|
*
|
||||||
|
* <p>If {@code false}, the runnable passed to {@link #setOnReadyHandler} will be called after
|
||||||
|
* {@code isReady()} transitions to {@code true}.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public abstract boolean isReady();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a {@link Runnable} that will be executed every time the stream {@link #isReady()} state
|
||||||
|
* changes from {@code false} to {@code true}. While it is not guaranteed that the same
|
||||||
|
* thread will always be used to execute the {@link Runnable}, it is guaranteed that executions
|
||||||
|
* are serialized with calls to the 'inbound' {@link StreamObserver}.
|
||||||
|
*
|
||||||
|
* <p>On client-side this method may only be called during {@link
|
||||||
|
* ClientResponseObserver#beforeStart}. On server-side it may only be called during the initial
|
||||||
|
* call to the application, before the service returns its {@code StreamObserver}.
|
||||||
|
*
|
||||||
|
* <p>Because there is a processing delay to deliver this notification, it is possible for
|
||||||
|
* concurrent writes to cause {@code isReady() == false} within this callback. Handle "spurious"
|
||||||
|
* notifications by checking {@code isReady()}'s current value instead of assuming it is now
|
||||||
|
* {@code true}. If {@code isReady() == false} the normal expectations apply, so there would be
|
||||||
|
* <em>another</em> {@code onReadyHandler} callback.
|
||||||
|
*
|
||||||
|
* @param onReadyHandler to call when peer is ready to receive more messages.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public abstract void setOnReadyHandler(Runnable onReadyHandler);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Requests the peer to produce {@code count} more messages to be delivered to the 'inbound'
|
||||||
|
* {@link StreamObserver}.
|
||||||
|
*
|
||||||
|
* <p>This method is safe to call from multiple threads without external synchronization.
|
||||||
|
*
|
||||||
|
* @param count more messages
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public abstract void request(int count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets message compression for subsequent calls to {@link #onNext}.
|
||||||
|
*
|
||||||
|
* @param enable whether to enable compression.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public abstract void setMessageCompression(boolean enable);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,13 +16,10 @@
|
||||||
|
|
||||||
package io.grpc.stub;
|
package io.grpc.stub;
|
||||||
|
|
||||||
import io.grpc.ExperimentalApi;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specialization of {@link StreamObserver} implemented by clients in order to interact with the
|
* Specialization of {@link StreamObserver} implemented by clients in order to interact with the
|
||||||
* advanced features of a call such as flow-control.
|
* advanced features of a call such as flow-control.
|
||||||
*/
|
*/
|
||||||
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/4693")
|
|
||||||
public interface ClientResponseObserver<ReqT, RespT> extends StreamObserver<RespT> {
|
public interface ClientResponseObserver<ReqT, RespT> extends StreamObserver<RespT> {
|
||||||
/**
|
/**
|
||||||
* Called by the runtime priot to the start of a call to provide a reference to the
|
* Called by the runtime priot to the start of a call to provide a reference to the
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,6 @@
|
||||||
|
|
||||||
package io.grpc.stub;
|
package io.grpc.stub;
|
||||||
|
|
||||||
import io.grpc.ExperimentalApi;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A refinement of {@link CallStreamObserver} to allows for interaction with call
|
* A refinement of {@link CallStreamObserver} to allows for interaction with call
|
||||||
* cancellation events on the server side.
|
* cancellation events on the server side.
|
||||||
|
|
@ -28,7 +26,6 @@ import io.grpc.ExperimentalApi;
|
||||||
* <p>DO NOT MOCK: The API is too complex to reliably mock. Use InProcessChannelBuilder to create
|
* <p>DO NOT MOCK: The API is too complex to reliably mock. Use InProcessChannelBuilder to create
|
||||||
* "real" RPCs suitable for testing and interact with the server using a normal client stub.
|
* "real" RPCs suitable for testing and interact with the server using a normal client stub.
|
||||||
*/
|
*/
|
||||||
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1788")
|
|
||||||
public abstract class ServerCallStreamObserver<V> extends CallStreamObserver<V> {
|
public abstract class ServerCallStreamObserver<V> extends CallStreamObserver<V> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -89,10 +86,61 @@ public abstract class ServerCallStreamObserver<V> extends CallStreamObserver<V>
|
||||||
* <li>{@link io.grpc.MethodDescriptor.MethodType#SERVER_STREAMING} operations.</li>
|
* <li>{@link io.grpc.MethodDescriptor.MethodType#SERVER_STREAMING} operations.</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
* </p>
|
* </p>
|
||||||
*
|
|
||||||
* <p>This API is still a work in-progress and may change in the future.
|
|
||||||
*/
|
*/
|
||||||
public void disableAutoRequest() {
|
public void disableAutoRequest() {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If {@code true}, indicates that the observer is capable of sending additional messages
|
||||||
|
* without requiring excessive buffering internally. This value is just a suggestion and the
|
||||||
|
* application is free to ignore it, however doing so may result in excessive buffering within the
|
||||||
|
* observer.
|
||||||
|
*
|
||||||
|
* <p>If {@code false}, the runnable passed to {@link #setOnReadyHandler} will be called after
|
||||||
|
* {@code isReady()} transitions to {@code true}.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public abstract boolean isReady();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a {@link Runnable} that will be executed every time the stream {@link #isReady()} state
|
||||||
|
* changes from {@code false} to {@code true}. While it is not guaranteed that the same
|
||||||
|
* thread will always be used to execute the {@link Runnable}, it is guaranteed that executions
|
||||||
|
* are serialized with calls to the 'inbound' {@link StreamObserver}.
|
||||||
|
*
|
||||||
|
* <p>On client-side this method may only be called during {@link
|
||||||
|
* ClientResponseObserver#beforeStart}. On server-side it may only be called during the initial
|
||||||
|
* call to the application, before the service returns its {@code StreamObserver}.
|
||||||
|
*
|
||||||
|
* <p>Because there is a processing delay to deliver this notification, it is possible for
|
||||||
|
* concurrent writes to cause {@code isReady() == false} within this callback. Handle "spurious"
|
||||||
|
* notifications by checking {@code isReady()}'s current value instead of assuming it is now
|
||||||
|
* {@code true}. If {@code isReady() == false} the normal expectations apply, so there would be
|
||||||
|
* <em>another</em> {@code onReadyHandler} callback.
|
||||||
|
*
|
||||||
|
* @param onReadyHandler to call when peer is ready to receive more messages.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public abstract void setOnReadyHandler(Runnable onReadyHandler);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Requests the peer to produce {@code count} more messages to be delivered to the 'inbound'
|
||||||
|
* {@link StreamObserver}.
|
||||||
|
*
|
||||||
|
* <p>This method is safe to call from multiple threads without external synchronization.
|
||||||
|
*
|
||||||
|
* @param count more messages
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public abstract void request(int count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets message compression for subsequent calls to {@link #onNext}.
|
||||||
|
*
|
||||||
|
* @param enable whether to enable compression.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public abstract void setMessageCompression(boolean enable);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -390,7 +390,7 @@ public class ClientCallsTest {
|
||||||
ClientCalls.asyncBidiStreamingCall(call, new ClientResponseObserver<Integer, String>() {
|
ClientCalls.asyncBidiStreamingCall(call, new ClientResponseObserver<Integer, String>() {
|
||||||
@Override
|
@Override
|
||||||
public void beforeStart(ClientCallStreamObserver<Integer> requestStream) {
|
public void beforeStart(ClientCallStreamObserver<Integer> requestStream) {
|
||||||
requestStream.disableAutoInboundFlowControl();
|
requestStream.disableAutoRequestWithInitial(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -288,7 +288,7 @@ public class ServerCallsTest {
|
||||||
public StreamObserver<Integer> invoke(StreamObserver<Integer> responseObserver) {
|
public StreamObserver<Integer> invoke(StreamObserver<Integer> responseObserver) {
|
||||||
ServerCallStreamObserver<Integer> serverCallObserver =
|
ServerCallStreamObserver<Integer> serverCallObserver =
|
||||||
(ServerCallStreamObserver<Integer>) responseObserver;
|
(ServerCallStreamObserver<Integer>) responseObserver;
|
||||||
serverCallObserver.disableAutoInboundFlowControl();
|
serverCallObserver.disableAutoRequest();
|
||||||
return new ServerCalls.NoopStreamObserver<>();
|
return new ServerCalls.NoopStreamObserver<>();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue