Class Http2MultiplexHandler
- java.lang.Object
-
- io.netty.channel.ChannelHandlerAdapter
-
- io.netty.channel.ChannelInboundHandlerAdapter
-
- io.netty.channel.ChannelDuplexHandler
-
- io.netty.handler.codec.http2.Http2ChannelDuplexHandler
-
- io.netty.handler.codec.http2.Http2MultiplexHandler
-
- All Implemented Interfaces:
ChannelHandler,ChannelInboundHandler,ChannelOutboundHandler
@UnstableApi public final class Http2MultiplexHandler extends Http2ChannelDuplexHandler
An HTTP/2 handler that creates child channels for each stream. This handler must be used in combination withHttp2FrameCodec.When a new stream is created, a new
Channelis created for it. Applications send and receiveHttp2StreamFrames on the created channel.ByteBufs cannot be processed by the channel; all writes that reach the head of the pipeline must be an instance ofHttp2StreamFrame. Writes that reach the head of the pipeline are processed directly by this handler and cannot be intercepted.The child channel will be notified of user events that impact the stream, such as
Http2GoAwayFrameandHttp2ResetFrame, as soon as they occur. AlthoughHttp2GoAwayFrameandHttp2ResetFramesignify that the remote is ignoring further communication, closing of the channel is delayed until any inbound queue is drained withChannel.read(), which follows the default behavior of channels in Netty. Applications are free to close the channel in response to such events if they don't have use for any queued messages. Any connection level events likeHttp2SettingsFrameandHttp2GoAwayFramewill be processed internally and also propagated down the pipeline for other handlers to act on.Outbound streams are supported via the
Http2StreamChannelBootstrap.ChannelConfig.setMaxMessagesPerRead(int)andChannelConfig.setAutoRead(boolean)are supported.Reference Counting
SomeHttp2StreamFrames implement theReferenceCountedinterface, as they carry reference counted objects (e.g.ByteBufs). The multiplex codec will callReferenceCounted.retain()before propagating a reference counted object through the pipeline, and thus an application handler needs to release such an object after having consumed it. For more information on reference counting take a look at https://netty.io/wiki/reference-counted-objects.htmlChannel Events
A child channel becomes active as soon as it is registered to anEventLoop. Therefore, an active channel does not map to an active HTTP/2 stream immediately. Only once aHttp2HeadersFramehas been successfully sent or received, does the channel map to an active HTTP/2 stream. In case it is not possible to open a new HTTP/2 stream (i.e. due to the maximum number of active streams being exceeded), the child channel receives an exception indicating the cause and is closed immediately thereafter.Writability and Flow Control
A child channel observes outbound/remote flow control via the channel's writability. A channel only becomes writable when it maps to an active HTTP/2 stream . A child channel does not know about the connection-level flow control window.ChannelHandlers are free to ignore the channel's writability, in which case the excessive writes will be buffered by the parent channel. It's important to note that onlyHttp2DataFrames are subject to HTTP/2 flow control.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private classHttp2MultiplexHandler.Http2MultiplexHandlerStreamChannel-
Nested classes/interfaces inherited from interface io.netty.channel.ChannelHandler
ChannelHandler.Sharable
-
-
Field Summary
Fields Modifier and Type Field Description (package private) static ChannelFutureListenerCHILD_CHANNEL_REGISTRATION_LISTENERprivate ChannelHandlerContextctxprivate intidCountprivate ChannelHandlerinboundStreamHandlerprivate booleanparentReadInProgressprivate java.util.Queue<AbstractHttp2StreamChannel>readCompletePendingQueueprivate ChannelHandlerupgradeStreamHandler
-
Constructor Summary
Constructors Constructor Description Http2MultiplexHandler(ChannelHandler inboundStreamHandler)Creates a new instanceHttp2MultiplexHandler(ChannelHandler inboundStreamHandler, ChannelHandler upgradeStreamHandler)Creates a new instance
-
Method Summary
-
Methods inherited from class io.netty.handler.codec.http2.Http2ChannelDuplexHandler
forEachActiveStream, handlerAdded, handlerRemoved, newStream
-
Methods inherited from class io.netty.channel.ChannelDuplexHandler
bind, close, connect, deregister, disconnect, flush, read, write
-
Methods inherited from class io.netty.channel.ChannelInboundHandlerAdapter
channelActive, channelInactive, channelRegistered, channelUnregistered
-
Methods inherited from class io.netty.channel.ChannelHandlerAdapter
ensureNotSharable, isSharable
-
-
-
-
Field Detail
-
CHILD_CHANNEL_REGISTRATION_LISTENER
static final ChannelFutureListener CHILD_CHANNEL_REGISTRATION_LISTENER
-
inboundStreamHandler
private final ChannelHandler inboundStreamHandler
-
upgradeStreamHandler
private final ChannelHandler upgradeStreamHandler
-
readCompletePendingQueue
private final java.util.Queue<AbstractHttp2StreamChannel> readCompletePendingQueue
-
parentReadInProgress
private boolean parentReadInProgress
-
idCount
private int idCount
-
ctx
private volatile ChannelHandlerContext ctx
-
-
Constructor Detail
-
Http2MultiplexHandler
public Http2MultiplexHandler(ChannelHandler inboundStreamHandler)
Creates a new instance- Parameters:
inboundStreamHandler- theChannelHandlerthat will be added to theChannelPipelineof theChannels created for new inbound streams.
-
Http2MultiplexHandler
public Http2MultiplexHandler(ChannelHandler inboundStreamHandler, ChannelHandler upgradeStreamHandler)
Creates a new instance- Parameters:
inboundStreamHandler- theChannelHandlerthat will be added to theChannelPipelineof theChannels created for new inbound streams.upgradeStreamHandler- theChannelHandlerthat will be added to theChannelPipelineof the upgradedChannel.
-
-
Method Detail
-
registerDone
static void registerDone(ChannelFuture future)
-
handlerAdded0
protected void handlerAdded0(ChannelHandlerContext ctx)
- Overrides:
handlerAdded0in classHttp2ChannelDuplexHandler
-
handlerRemoved0
protected void handlerRemoved0(ChannelHandlerContext ctx)
- Overrides:
handlerRemoved0in classHttp2ChannelDuplexHandler
-
channelRead
public void channelRead(ChannelHandlerContext ctx, java.lang.Object msg) throws java.lang.Exception
Description copied from class:ChannelInboundHandlerAdapterCallsChannelHandlerContext.fireChannelRead(Object)to forward to the nextChannelInboundHandlerin theChannelPipeline. Sub-classes may override this method to change behavior.- Specified by:
channelReadin interfaceChannelInboundHandler- Overrides:
channelReadin classChannelInboundHandlerAdapter- Throws:
java.lang.Exception
-
channelWritabilityChanged
public void channelWritabilityChanged(ChannelHandlerContext ctx) throws java.lang.Exception
Description copied from class:ChannelInboundHandlerAdapterCallsChannelHandlerContext.fireChannelWritabilityChanged()to forward to the nextChannelInboundHandlerin theChannelPipeline. Sub-classes may override this method to change behavior.- Specified by:
channelWritabilityChangedin interfaceChannelInboundHandler- Overrides:
channelWritabilityChangedin classChannelInboundHandlerAdapter- Throws:
java.lang.Exception
-
userEventTriggered
public void userEventTriggered(ChannelHandlerContext ctx, java.lang.Object evt) throws java.lang.Exception
Description copied from class:ChannelInboundHandlerAdapterCallsChannelHandlerContext.fireUserEventTriggered(Object)to forward to the nextChannelInboundHandlerin theChannelPipeline. Sub-classes may override this method to change behavior.- Specified by:
userEventTriggeredin interfaceChannelInboundHandler- Overrides:
userEventTriggeredin classChannelInboundHandlerAdapter- Throws:
java.lang.Exception
-
newOutboundStream
Http2StreamChannel newOutboundStream()
-
exceptionCaught
public void exceptionCaught(ChannelHandlerContext ctx, java.lang.Throwable cause) throws java.lang.Exception
Description copied from class:ChannelInboundHandlerAdapterCallsChannelHandlerContext.fireExceptionCaught(Throwable)to forward to the nextChannelHandlerin theChannelPipeline. Sub-classes may override this method to change behavior.- Specified by:
exceptionCaughtin interfaceChannelHandler- Specified by:
exceptionCaughtin interfaceChannelInboundHandler- Overrides:
exceptionCaughtin classChannelInboundHandlerAdapter- Throws:
java.lang.Exception
-
isServer
private static boolean isServer(ChannelHandlerContext ctx)
-
onHttp2GoAwayFrame
private void onHttp2GoAwayFrame(ChannelHandlerContext ctx, Http2GoAwayFrame goAwayFrame)
-
channelReadComplete
public void channelReadComplete(ChannelHandlerContext ctx) throws java.lang.Exception
Notifies any child streams of the read completion.- Specified by:
channelReadCompletein interfaceChannelInboundHandler- Overrides:
channelReadCompletein classChannelInboundHandlerAdapter- Throws:
java.lang.Exception
-
processPendingReadCompleteQueue
private void processPendingReadCompleteQueue()
-
-