Package org.apache.druid.frame.channel
Class ReadableByteChunksFrameChannel
java.lang.Object
org.apache.druid.frame.channel.ReadableByteChunksFrameChannel
- All Implemented Interfaces:
Closeable,AutoCloseable,ReadableFrameChannel
Channel backed by a byte stream that is continuously streamed in using
addChunk(byte[]). The byte stream
must be in the format of a FrameFile.
This class is used by FrameFileHttpResponseHandler to provide nonblocking
reads from a remote http server.-
Method Summary
Modifier and TypeMethodDescriptioncom.google.common.util.concurrent.ListenableFuture<?> addChunk(byte[] chunk) Adds a chunk of bytes.booleancanRead()Returns whether this channel has a frame or error condition currently available.voidclose()Releases any resources associated with this readable channel.Create a channel that aims to limit its memory footprint to one frame.voidCall method when caller is done adding chunks.longgetId()booleanbooleanReturns whether this channel is finished.read()Returns the next available frame from this channel.com.google.common.util.concurrent.ListenableFuture<?> Returns a future that will resolve when eitherReadableFrameChannel.isFinished()orReadableFrameChannel.canRead()would return true.voidClears the channel and replaces it with the given error.
-
Method Details
-
create
Create a channel that aims to limit its memory footprint to one frame. The channel exerts backpressure fromaddChunk(byte[])immediately once a full frame has been buffered. -
addChunk
@Nullable public com.google.common.util.concurrent.ListenableFuture<?> addChunk(byte[] chunk) Adds a chunk of bytes. If this chunk forms a full frame, it will immediately become available for reading. Otherwise, the bytes will be buffered until a full frame is encountered. Returns a backpressure future if the amount of queued bytes is at or above this channel's limit. If the return future is nonnull, callers are politely requested to wait for the future to resolve before adding additional chunks. (This is not enforced; addChunk will continue to accept new chunks even if the channel is over its limit.) When done adding chunks calldoneWriting.- Throws:
ChannelClosedForWritesException- if the channel is closed
-
setError
Clears the channel and replaces it with the given error. After calling this method, no additional chunks will be accepted. -
doneWriting
public void doneWriting()Call method when caller is done adding chunks. -
isFinished
public boolean isFinished()Description copied from interface:ReadableFrameChannelReturns whether this channel is finished. Finished channels will not generate any further frames or errors. Generally, once you discover that a channel is finished, you should callReadableFrameChannel.close()and then discard it. Note that it is possible for a channel to be unfinished and also have no available frames or errors. This happens when it is not in a ready-for-reading state. SeeReadableFrameChannel.readabilityFuture()for details.- Specified by:
isFinishedin interfaceReadableFrameChannel
-
canRead
public boolean canRead()Description copied from interface:ReadableFrameChannelReturns whether this channel has a frame or error condition currently available. If this method returns true, then you can callReadableFrameChannel.read()to retrieve the frame or error. Note that it is possible for a channel to be unfinished and also have no available frames or errors. This happens when it is not in a ready-for-reading state. SeeReadableFrameChannel.readabilityFuture()for details.- Specified by:
canReadin interfaceReadableFrameChannel
-
read
Description copied from interface:ReadableFrameChannelReturns the next available frame from this channel. Before calling this method, you should checkReadableFrameChannel.canRead()to ensure there is a frame or error available.- Specified by:
readin interfaceReadableFrameChannel
-
readabilityFuture
public com.google.common.util.concurrent.ListenableFuture<?> readabilityFuture()Description copied from interface:ReadableFrameChannelReturns a future that will resolve when eitherReadableFrameChannel.isFinished()orReadableFrameChannel.canRead()would return true. The future will never resolve to an exception. If something exceptional has happened, the exception can be retrieved fromReadableFrameChannel.read().- Specified by:
readabilityFuturein interfaceReadableFrameChannel
-
close
public void close()Description copied from interface:ReadableFrameChannelReleases any resources associated with this readable channel. After calling this, you should not call any other methods on the channel.- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Specified by:
closein interfaceReadableFrameChannel
-
getId
-
getBytesAdded
public long getBytesAdded() -
isErrorOrFinished
public boolean isErrorOrFinished()
-