Class SemaphoreValve

All Implemented Interfaces:
MBeanRegistration, Contained, JmxEnabled, Lifecycle, Valve

public class SemaphoreValve extends ValveBase

Implementation of a Valve that limits concurrency.

This Valve may be attached to any Container, depending on the granularity of the concurrency control you wish to perform. Note that internally, some async requests may require multiple serial requests to complete what - to the user - appears as a single request.

Author:
Remy Maucherat
  • Field Details

    • semaphore

      protected Semaphore semaphore
      Semaphore.
    • concurrency

      protected int concurrency
      Concurrency level of the semaphore.
    • fairness

      protected boolean fairness
      Fairness of the semaphore.
    • block

      protected boolean block
      Block until a permit is available.
    • interruptible

      protected boolean interruptible
      Block interruptibly until a permit is available.
    • highConcurrencyStatus

      protected int highConcurrencyStatus
      High concurrency status. This status code is returned as an error if concurrency is too high.
  • Constructor Details

    • SemaphoreValve

      public SemaphoreValve()
  • Method Details

    • getConcurrency

      public int getConcurrency()
    • setConcurrency

      public void setConcurrency(int concurrency)
    • getFairness

      public boolean getFairness()
    • setFairness

      public void setFairness(boolean fairness)
    • getBlock

      public boolean getBlock()
    • setBlock

      public void setBlock(boolean block)
    • getInterruptible

      public boolean getInterruptible()
    • setInterruptible

      public void setInterruptible(boolean interruptible)
    • getHighConcurrencyStatus

      public int getHighConcurrencyStatus()
    • setHighConcurrencyStatus

      public void setHighConcurrencyStatus(int highConcurrencyStatus)
    • startInternal

      protected void startInternal() throws LifecycleException
      Start this component and implement the requirements of LifecycleBase.startInternal().
      Overrides:
      startInternal in class ValveBase
      Throws:
      LifecycleException - if this component detects a fatal error that prevents this component from being used
    • stopInternal

      protected void stopInternal() throws LifecycleException
      Stop this component and implement the requirements of LifecycleBase.stopInternal().
      Overrides:
      stopInternal in class ValveBase
      Throws:
      LifecycleException - if this component detects a fatal error that prevents this component from being used
    • invoke

      public void invoke(Request request, Response response) throws IOException, ServletException
      Do concurrency control on the request using the semaphore.
      Parameters:
      request - The servlet request to be processed
      response - The servlet response to be created
      Throws:
      IOException - if an input/output error occurs
      ServletException - if a servlet error occurs
    • controlConcurrency

      public boolean controlConcurrency(Request request, Response response)
      Subclass friendly method to add conditions.
      Parameters:
      request - The Servlet request
      response - The Servlet response
      Returns:
      true if the concurrency control should occur on this request
    • permitDenied

      public void permitDenied(Request request, Response response) throws IOException, ServletException
      Subclass friendly method to add error handling when a permit isn't granted.
      Parameters:
      request - The Servlet request
      response - The Servlet response
      Throws:
      IOException - Error writing output
      ServletException - Other error