Class AbstractTrafficShapingHandler

java.lang.Object
org.jboss.netty.channel.SimpleChannelHandler
org.jboss.netty.handler.traffic.AbstractTrafficShapingHandler
All Implemented Interfaces:
ChannelDownstreamHandler, ChannelHandler, ChannelUpstreamHandler, ExternalResourceReleasable
Direct Known Subclasses:
ChannelTrafficShapingHandler, GlobalChannelTrafficShapingHandler, GlobalTrafficShapingHandler

public abstract class AbstractTrafficShapingHandler extends SimpleChannelHandler implements ExternalResourceReleasable

AbstractTrafficShapingHandler allows to limit the global bandwidth (see GlobalTrafficShapingHandler) or per session bandwidth (see ChannelTrafficShapingHandler), as traffic shaping. It allows too to implement an almost real time monitoring of the bandwidth using the monitors from TrafficCounter that will call back every checkInterval the method doAccounting of this handler.

An ObjectSizeEstimator can be passed at construction to specify what is the size of the object to be read or write accordingly to the type of object. If not specified, it will used the DefaultObjectSizeEstimator implementation.

If you want for any particular reasons to stop the monitoring (accounting) or to change the read/write limit or the check interval, several methods allow that for you:

  • configure allows you to change read or write limits, or the checkInterval
  • getTrafficCounter allows you to have access to the TrafficCounter and so to stop or start the monitoring, to change the checkInterval directly, or to have access to its values.
  • Field Details

    • logger

      static InternalLogger logger
      Internal logger
    • DEFAULT_CHECK_INTERVAL

      public static final long DEFAULT_CHECK_INTERVAL
      Default delay between two checks: 1s
      See Also:
    • DEFAULT_MAX_TIME

      public static final long DEFAULT_MAX_TIME
      Default max delay in case of traffic shaping (during which no communication will occur). Shall be less than TIMEOUT. Here half of "standard" 30s
      See Also:
    • DEFAULT_MAX_SIZE

      static final long DEFAULT_MAX_SIZE
      Default max size to not exceed in buffer (write only).
      See Also:
    • MINIMAL_WAIT

      static final long MINIMAL_WAIT
      Default minimal time to wait
      See Also:
    • CHANNEL_DEFAULT_USER_DEFINED_WRITABILITY_INDEX

      static final int CHANNEL_DEFAULT_USER_DEFINED_WRITABILITY_INDEX
      See Also:
    • GLOBAL_DEFAULT_USER_DEFINED_WRITABILITY_INDEX

      static final int GLOBAL_DEFAULT_USER_DEFINED_WRITABILITY_INDEX
      See Also:
    • GLOBALCHANNEL_DEFAULT_USER_DEFINED_WRITABILITY_INDEX

      static final int GLOBALCHANNEL_DEFAULT_USER_DEFINED_WRITABILITY_INDEX
      See Also:
    • trafficCounter

      protected TrafficCounter trafficCounter
      Traffic Counter
    • objectSizeEstimator

      private ObjectSizeEstimator objectSizeEstimator
      ObjectSizeEstimator
    • timer

      protected Timer timer
      Timer associated to any TrafficCounter
    • timeout

      volatile Timeout timeout
      used in releaseExternalResources() to cancel the timer
    • writeLimit

      private volatile long writeLimit
      Limit in B/s to apply to write
    • readLimit

      private volatile long readLimit
      Limit in B/s to apply to read
    • checkInterval

      protected volatile long checkInterval
      Delay between two performance snapshots
    • maxTime

      protected volatile long maxTime
      Max delay in wait
    • maxWriteDelay

      volatile long maxWriteDelay
      Max time to delay before proposing to stop writing new objects from next handlers
    • maxWriteSize

      volatile long maxWriteSize
      Max size in the list before proposing to stop writing new objects from next handlers
    • release

      final AtomicBoolean release
      Boolean associated with the release of this TrafficShapingHandler. It will be true only once when the releaseExternalRessources is called to prevent waiting when shutdown.
    • index

      final int index
  • Constructor Details

    • AbstractTrafficShapingHandler

      protected AbstractTrafficShapingHandler(Timer timer, long writeLimit, long readLimit, long checkInterval)
      Constructor using default ObjectSizeEstimator and default max time as delay allowed value of 15000L ms.
      Parameters:
      timer - created once for instance like HashedWheelTimer(10, TimeUnit.MILLISECONDS, 1024).
      writeLimit - 0 or a limit in bytes/s
      readLimit - 0 or a limit in bytes/s
      checkInterval - The delay between two computations of performances for channels or 0 if no stats are to be computed.
    • AbstractTrafficShapingHandler

      protected AbstractTrafficShapingHandler(ObjectSizeEstimator objectSizeEstimator, Timer timer, long writeLimit, long readLimit, long checkInterval)
      Constructor using the specified ObjectSizeEstimator and default max time as delay allowed value of 15000L ms.
      Parameters:
      objectSizeEstimator - the ObjectSizeEstimator that will be used to compute the size of the message.
      timer - created once for instance like HashedWheelTimer(10, TimeUnit.MILLISECONDS, 1024).
      writeLimit - 0 or a limit in bytes/s
      readLimit - 0 or a limit in bytes/s
      checkInterval - The delay between two computations of performances for channels or 0 if no stats are to be computed.
    • AbstractTrafficShapingHandler

      protected AbstractTrafficShapingHandler(Timer timer, long writeLimit, long readLimit)
      Constructor using default ObjectSizeEstimator and using default Check Interval value of 1000L ms and default max time as delay allowed value of 15000L ms.
      Parameters:
      timer - created once for instance like HashedWheelTimer(10, TimeUnit.MILLISECONDS, 1024).
      writeLimit - 0 or a limit in bytes/s
      readLimit - 0 or a limit in bytes/s
    • AbstractTrafficShapingHandler

      protected AbstractTrafficShapingHandler(ObjectSizeEstimator objectSizeEstimator, Timer timer, long writeLimit, long readLimit)
      Constructor using the specified ObjectSizeEstimator and using default Check Interval value of 1000L ms and default max time as delay allowed value of 15000L ms.
      Parameters:
      objectSizeEstimator - the ObjectSizeEstimator that will be used to compute the size of the message.
      timer - created once for instance like HashedWheelTimer(10, TimeUnit.MILLISECONDS, 1024).
      writeLimit - 0 or a limit in bytes/s
      readLimit - 0 or a limit in bytes/s
    • AbstractTrafficShapingHandler

      protected AbstractTrafficShapingHandler(Timer timer)
      Constructor using default ObjectSizeEstimator and using NO LIMIT and default Check Interval value of 1000L ms and default max time as delay allowed value of 15000L ms.
      Parameters:
      timer - created once for instance like HashedWheelTimer(10, TimeUnit.MILLISECONDS, 1024).
    • AbstractTrafficShapingHandler

      protected AbstractTrafficShapingHandler(ObjectSizeEstimator objectSizeEstimator, Timer timer)
      Constructor using the specified ObjectSizeEstimator and using NO LIMIT and default Check Interval value of 1000L ms and default max time as delay allowed value of 15000L ms.
      Parameters:
      objectSizeEstimator - the ObjectSizeEstimator that will be used to compute the size of the message.
      timer - created once for instance like HashedWheelTimer(10, TimeUnit.MILLISECONDS, 1024).
    • AbstractTrafficShapingHandler

      protected AbstractTrafficShapingHandler(Timer timer, long checkInterval)
      Constructor using default ObjectSizeEstimator and using NO LIMIT and default max time as delay allowed value of 15000L ms.
      Parameters:
      timer - created once for instance like HashedWheelTimer(10, TimeUnit.MILLISECONDS, 1024).
      checkInterval - The delay between two computations of performances for channels or 0 if no stats are to be computed.
    • AbstractTrafficShapingHandler

      protected AbstractTrafficShapingHandler(ObjectSizeEstimator objectSizeEstimator, Timer timer, long checkInterval)
      Constructor using the specified ObjectSizeEstimator and using NO LIMIT and default max time as delay allowed value of 15000L ms.
      Parameters:
      objectSizeEstimator - the ObjectSizeEstimator that will be used to compute the size of the message.
      timer - created once for instance like HashedWheelTimer(10, TimeUnit.MILLISECONDS, 1024).
      checkInterval - The delay between two computations of performances for channels or 0 if no stats are to be computed.
    • AbstractTrafficShapingHandler

      protected AbstractTrafficShapingHandler(Timer timer, long writeLimit, long readLimit, long checkInterval, long maxTime)
      Constructor using default ObjectSizeEstimator.
      Parameters:
      timer - created once for instance like HashedWheelTimer(10, TimeUnit.MILLISECONDS, 1024).
      writeLimit - 0 or a limit in bytes/s
      readLimit - 0 or a limit in bytes/s
      checkInterval - The delay between two computations of performances for channels or 0 if no stats are to be computed.
      maxTime - The max time to wait in case of excess of traffic (to prevent Time Out event). Must be positive.
    • AbstractTrafficShapingHandler

      protected AbstractTrafficShapingHandler(ObjectSizeEstimator objectSizeEstimator, Timer timer, long writeLimit, long readLimit, long checkInterval, long maxTime)
      Constructor using the specified ObjectSizeEstimator.
      Parameters:
      objectSizeEstimator - the ObjectSizeEstimator that will be used to compute the size of the message.
      timer - created once for instance like HashedWheelTimer(10, TimeUnit.MILLISECONDS, 1024).
      writeLimit - 0 or a limit in bytes/s
      readLimit - 0 or a limit in bytes/s
      checkInterval - The delay between two computations of performances for channels or 0 if no stats are to be computed.
      maxTime - The max time to wait in case of excess of traffic (to prevent Time Out event). Must be positive.
  • Method Details

    • userDefinedWritabilityIndex

      int userDefinedWritabilityIndex()
      Returns:
      the index to be used by the TrafficShapingHandler to manage the user defined writability. For Channel TSH it is defined as 1, for Global TSH it is defined as 2, for GlobalChannel TSH it is defined as 3.
    • init

      private void init(ObjectSizeEstimator newObjectSizeEstimator, Timer newTimer, long newWriteLimit, long newReadLimit, long newCheckInterval, long newMaxTime)
    • setTrafficCounter

      void setTrafficCounter(TrafficCounter newTrafficCounter)
      Parameters:
      newTrafficCounter - the TrafficCounter to set
    • configure

      public void configure(long newWriteLimit, long newReadLimit, long newCheckInterval)
      Change the underlying limitations and check interval.

      Note the change will be taken as best effort, meaning that all already scheduled traffics will not be changed, but only applied to new traffics.

      So the expected usage of this method is to be used not too often, accordingly to the traffic shaping configuration.
      Parameters:
      newWriteLimit - The new write limit (in bytes)
      newReadLimit - The new read limit (in bytes)
      newCheckInterval - The new check interval (in milliseconds)
    • configure

      public void configure(long newWriteLimit, long newReadLimit)
      Change the underlying limitations.

      Note the change will be taken as best effort, meaning that all already scheduled traffics will not be changed, but only applied to new traffics.

      So the expected usage of this method is to be used not too often, accordingly to the traffic shaping configuration.
      Parameters:
      newWriteLimit - The new write limit (in bytes)
      newReadLimit - The new read limit (in bytes)
    • configure

      public void configure(long newCheckInterval)
      Change the check interval.
    • getWriteLimit

      public long getWriteLimit()
      Returns:
      the writeLimit
    • setWriteLimit

      public void setWriteLimit(long writeLimit)

      Note the change will be taken as best effort, meaning that all already scheduled traffics will not be changed, but only applied to new traffics.

      So the expected usage of this method is to be used not too often, accordingly to the traffic shaping configuration.
      Parameters:
      writeLimit - the writeLimit to set
    • getReadLimit

      public long getReadLimit()
      Returns:
      the readLimit
    • setReadLimit

      public void setReadLimit(long readLimit)

      Note the change will be taken as best effort, meaning that all already scheduled traffics will not be changed, but only applied to new traffics.

      So the expected usage of this method is to be used not too often, accordingly to the traffic shaping configuration.
      Parameters:
      readLimit - the readLimit to set
    • getCheckInterval

      public long getCheckInterval()
      Returns:
      the checkInterval
    • setCheckInterval

      public void setCheckInterval(long newCheckInterval)
      Parameters:
      newCheckInterval - the checkInterval to set
    • getMaxTimeWait

      public long getMaxTimeWait()
      Returns:
      the max delay on wait
    • setMaxTimeWait

      public void setMaxTimeWait(long maxTime)

      Note the change will be taken as best effort, meaning that all already scheduled traffics will not be changed, but only applied to new traffics.

      So the expected usage of this method is to be used not too often, accordingly to the traffic shaping configuration.
      Parameters:
      maxTime - Max delay in wait, shall be less than TIME OUT in related protocol. Must be positive.
    • getMaxWriteDelay

      public long getMaxWriteDelay()
      Returns:
      the maxWriteDelay
    • setMaxWriteDelay

      public void setMaxWriteDelay(long maxWriteDelay)

      Note the change will be taken as best effort, meaning that all already scheduled traffics will not be changed, but only applied to new traffics.

      So the expected usage of this method is to be used not too often, accordingly to the traffic shaping configuration.
      Parameters:
      maxWriteDelay - the maximum Write Delay in ms in the buffer allowed before write suspended is set. Must be positive.
    • getMaxWriteSize

      public long getMaxWriteSize()
      Returns:
      the maxWriteSize default being 4194304L bytes
    • setMaxWriteSize

      public void setMaxWriteSize(long maxWriteSize)

      Note the change will be taken as best effort, meaning that all already scheduled traffics will not be changed, but only applied to new traffics.

      So the expected usage of this method is to be used not too often, accordingly to the traffic shaping configuration.
      Parameters:
      maxWriteSize - the maximum Write Size allowed in the buffer per channel before write suspended is set, default being 4194304L bytes
    • doAccounting

      protected void doAccounting(TrafficCounter counter)
      Called each time the accounting is computed from the TrafficCounters. This method could be used for instance to implement almost real time accounting.
      Parameters:
      counter - the TrafficCounter that computes its performance
    • releaseReadSuspended

      void releaseReadSuspended(ChannelHandlerContext ctx)
      Release the Read suspension.
    • messageReceived

      public void messageReceived(ChannelHandlerContext ctx, MessageEvent evt) throws Exception
      Description copied from class: SimpleChannelHandler
      Invoked when a message object (e.g: ChannelBuffer) was received from a remote peer.
      Overrides:
      messageReceived in class SimpleChannelHandler
      Throws:
      Exception
    • checkWaitReadTime

      long checkWaitReadTime(ChannelHandlerContext ctx, long wait, long now)
      Method overridden in GTSH to take into account specific timer for the channel.
      Parameters:
      wait - the wait delay computed in ms
      now - the relative now time in ms
      Returns:
      the wait to use according to the context.
    • informReadOperation

      void informReadOperation(ChannelHandlerContext ctx, long now)
      Method overridden in GTSH to take into account specific timer for the channel.
      Parameters:
      now - the relative now time in ms
    • writeRequested

      public void writeRequested(ChannelHandlerContext ctx, MessageEvent evt) throws Exception
      Description copied from class: SimpleChannelHandler
      Invoked when Channel.write(Object) is called.
      Overrides:
      writeRequested in class SimpleChannelHandler
      Throws:
      Exception
    • internalSubmitWrite

      @Deprecated protected void internalSubmitWrite(ChannelHandlerContext ctx, MessageEvent evt) throws Exception
      Deprecated.
      Throws:
      Exception
    • submitWrite

      @Deprecated protected void submitWrite(ChannelHandlerContext ctx, MessageEvent evt, long delay) throws Exception
      Deprecated.
      Throws:
      Exception
    • submitWrite

      abstract void submitWrite(ChannelHandlerContext ctx, MessageEvent evt, long size, long delay, long now) throws Exception
      Throws:
      Exception
    • setWritable

      void setWritable(ChannelHandlerContext ctx, boolean writable)
    • checkWriteSuspend

      void checkWriteSuspend(ChannelHandlerContext ctx, long delay, long queueSize)
      Check the writability according to delay and size for the channel. Set if necessary the write suspended status.
      Parameters:
      delay - the computed delai
      queueSize - the current queueSize
    • releaseWriteSuspended

      void releaseWriteSuspended(ChannelHandlerContext ctx)
      Explicitly release the Write suspended status.
    • getTrafficCounter

      public TrafficCounter getTrafficCounter()
      Returns:
      the current TrafficCounter (if channel is still connected).
    • releaseExternalResources

      public void releaseExternalResources()
      Description copied from interface: ExternalResourceReleasable
      Releases the external resources that this object depends on. You should not call this method if the external resources (e.g. thread pool) are in use by other objects.
      Specified by:
      releaseExternalResources in interface ExternalResourceReleasable
    • checkAttachment

    • channelConnected

      public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception
      Description copied from class: SimpleChannelHandler
      Invoked when a Channel is open, bound to a local address, and connected to a remote address.
      Overrides:
      channelConnected in class SimpleChannelHandler
      Throws:
      Exception
    • calculateSize

      protected long calculateSize(Object obj)
    • toString

      public String toString()
      Overrides:
      toString in class Object