RequestT - The type of each request.ResponseT - The type of each response.@BetaApi(value="The surface for streaming is not stable yet and may change in the future.") public class BidiStream<RequestT,ResponseT> extends ServerStream<ResponseT> implements ClientStream<RequestT>
This class asynchronously pulls responses from upstream via StreamController.request(int) and exposes them via its Iterator. The implementation is back
pressure aware and uses a constant buffer of 1 item.
Please note that the stream can only be consumed once and must either be fully consumed or be canceled.
This class can also be used to send requests to the server using send(Object).
Neither this class nor the iterator it returns is thread-safe.
In the example below, we iterate through responses from the server and echo back the items we see:
BidiStream<Item> stream = ...;
for (Item item : stream) {
System.out.println(item.id());
stream.send(item.id());
// Allow for early termination
if (item.id().equals("needle")) {
// Cancelling the stream will cause `hasNext()` to return false on the next iteration,
// naturally breaking the loop.
stream.cancel();
}
}
| Modifier and Type | Method and Description |
|---|---|
void |
closeSend()
Closes the sending side of the stream.
|
void |
closeSendWithError(Throwable t)
Closes the sending side of the stream with error.
|
boolean |
isSendReady()
Reports whether a message can be sent without requiring excessive buffering internally.
|
void |
send(RequestT req)
Send
req to the server. |
cancel, isReceiveReady, iteratorclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitforEach, spliteratorpublic void send(RequestT req)
req to the server.send in interface ClientStream<RequestT>public boolean isSendReady()
This method only provides a hint. It is still correct for the user to call send(Object) even when this method returns false.
isSendReady in interface ClientStream<RequestT>public void closeSend()
send(Object),
closeSend(), or closeSendWithError(Throwable) are allowed.
Calling this method does not affect the receiving side, the iterator will continue to yield responses from the server.
closeSend in interface ClientStream<RequestT>public void closeSendWithError(Throwable t)
send(Object), closeSend(), or closeSendWithError(Throwable) are allowed.
Calling this method does not affect the receiving side, the iterator will continue to yield responses from the server.
closeSendWithError in interface ClientStream<RequestT>