Interface ShutdownStrategy

All Superinterfaces:
AutoCloseable, Service, StaticService

public interface ShutdownStrategy extends StaticService
Pluggable strategy that performs the actual graceful shutdown sequence when a CamelContext is stopping.

Graceful shutdown is non-trivial: Camel must stop all route consumers (so no new messages enter) while keeping routes alive long enough to drain in-flight exchanges, including messages sitting in in-memory queues (SEDA, etc.). The default implementation shuts down routes in reverse startup order (see RouteStartupOrder), waits for in-flight exchanges to complete up to the configured timeout, then forces shutdown if the timeout expires.

This SPI is intended for framework and container integrators. End users who need to stop individual routes should use RouteController via CamelContext.getRouteController() instead. Per-route and per-consumer shutdown behaviour can be tuned via ShutdownRoute and ShutdownRunningTask without replacing the strategy.

See Also:
  • Method Details

    • shutdownForced

      void shutdownForced(CamelContext context, List<RouteStartupOrder> routes) throws Exception
      Shutdown the routes, forcing shutdown being more aggressive, if timeout occurred.

      This operation is used when CamelContext is shutting down, to ensure Camel will shutdown if messages seems to be stuck.

      Parameters:
      context - the camel context
      routes - the routes, ordered by the order they were started
      Throws:
      Exception - is thrown if error shutting down the consumers, however its preferred to avoid this
    • shutdown

      void shutdown(CamelContext context, List<RouteStartupOrder> routes) throws Exception
      Shutdown the routes
      Parameters:
      context - the camel context
      routes - the routes, ordered by the order they were started
      Throws:
      Exception - is thrown if error shutting down the consumers, however its preferred to avoid this
    • suspend

      void suspend(CamelContext context, List<RouteStartupOrder> routes) throws Exception
      Suspends the routes
      Parameters:
      context - the camel context
      routes - the routes, ordered by the order they are started
      Throws:
      Exception - is thrown if error suspending the consumers, however its preferred to avoid this
    • shutdown

      void shutdown(CamelContext context, List<RouteStartupOrder> routes, long timeout, TimeUnit timeUnit) throws Exception
      Shutdown the routes using a specified timeout instead of the default timeout values
      Parameters:
      context - the camel context
      routes - the routes, ordered by the order they are started
      timeout - timeout
      timeUnit - the unit to use
      Throws:
      Exception - is thrown if error shutting down the consumers, however its preferred to avoid this
    • shutdown

      boolean shutdown(CamelContext context, RouteStartupOrder route, long timeout, TimeUnit timeUnit, boolean abortAfterTimeout) throws Exception
      Shutdown the route using a specified timeout instead of the default timeout values and supports abortAfterTimeout mode
      Parameters:
      context - the camel context
      route - the route
      timeout - timeout
      timeUnit - the unit to use
      abortAfterTimeout - should abort shutdown after timeout
      Returns:
      true if the route is stopped before the timeout
      Throws:
      Exception - is thrown if error shutting down the consumer, however its preferred to avoid this
    • suspend

      void suspend(CamelContext context, List<RouteStartupOrder> routes, long timeout, TimeUnit timeUnit) throws Exception
      Suspends the routes using a specified timeout instead of the default timeout values
      Parameters:
      context - the camel context
      routes - the routes, ordered by the order they were started
      timeout - timeout
      timeUnit - the unit to use
      Throws:
      Exception - is thrown if error suspending the consumers, however its preferred to avoid this
    • setTimeout

      void setTimeout(long timeout)
      Set a timeout to wait for the shutdown to complete.

      You must set a positive value. If you want to wait (forever) then use a very high value such as Long.MAX_VALUE

      The default timeout unit is SECONDS

      Parameters:
      timeout - timeout
      Throws:
      IllegalArgumentException - if the timeout value is 0 or negative
    • getTimeout

      long getTimeout()
      Gets the timeout.

      The default timeout unit is SECONDS

      Returns:
      the timeout
    • setTimeUnit

      void setTimeUnit(TimeUnit timeUnit)
      Set the time unit to use
      Parameters:
      timeUnit - the unit to use
    • getTimeUnit

      TimeUnit getTimeUnit()
      Gets the time unit used
      Returns:
      the time unit
    • setSuppressLoggingOnTimeout

      void setSuppressLoggingOnTimeout(boolean suppressLoggingOnTimeout)
      Whether Camel should try to suppress logging during shutdown and timeout was triggered, meaning forced shutdown is happening. And during forced shutdown we want to avoid logging errors/warnings et al. in the logs as a side effect of the forced timeout.

      By default, this is false

      Notice the suppression is a best effort as there may still be some logs coming from 3rd party libraries and whatnot, which Camel cannot control.

      Parameters:
      suppressLoggingOnTimeout - true to suppress logging, false to log as usual.
    • isSuppressLoggingOnTimeout

      boolean isSuppressLoggingOnTimeout()
      Whether Camel should try to suppress logging during shutdown and timeout was triggered, meaning forced shutdown is happening. And during forced shutdown we want to avoid logging errors/warnings et al. in the logs as a side effect of the forced timeout.

      By default, this is false

      Notice the suppression is a best effort as there may still be some logs coming from 3rd party libraries and whatnot, which Camel cannot control.

    • setShutdownNowOnTimeout

      void setShutdownNowOnTimeout(boolean shutdownNowOnTimeout)
      Sets whether to force shutdown of all consumers when a timeout occurred and thus not all consumers was shutdown within that period.

      You should have good reasons to set this option to false as it means that the routes keep running and is halted abruptly when CamelContext has been shutdown.

      Parameters:
      shutdownNowOnTimeout - true to force shutdown, false to leave them running
    • isShutdownNowOnTimeout

      boolean isShutdownNowOnTimeout()
      Whether to force shutdown of all consumers when a timeout occurred.
      Returns:
      force shutdown or not
    • setShutdownRoutesInReverseOrder

      void setShutdownRoutesInReverseOrder(boolean shutdownRoutesInReverseOrder)
      Sets whether routes should be shutdown in reverse or the same order as they were started.
      Parameters:
      shutdownRoutesInReverseOrder - true to shutdown in reverse order
    • isShutdownRoutesInReverseOrder

      boolean isShutdownRoutesInReverseOrder()
      Whether to shut down routes in reverse order than they were started.

      This option is by default set to true.

      Returns:
      true if routes should be shutdown in reverse order.
    • setLogInflightExchangesOnTimeout

      void setLogInflightExchangesOnTimeout(boolean logInflightExchangesOnTimeout)
      Sets whether to log information about the inflight Exchanges which are still running during a shutdown which didn't complete without the given timeout.
      Parameters:
      logInflightExchangesOnTimeout - true to log information about the inflight exchanges, false to not log
    • isLogInflightExchangesOnTimeout

      boolean isLogInflightExchangesOnTimeout()
      Whether to log information about the inflight Exchanges which are still running during a shutdown which didn't complete without the given timeout.
    • isForceShutdown

      boolean isForceShutdown()
      Whether the shutdown strategy is forcing to shut down
    • hasTimeoutOccurred

      @Deprecated(since="4.8.0") boolean hasTimeoutOccurred()
      Deprecated.
      Whether a timeout has occurred during a shutdown.
    • isTimeoutOccurred

      default boolean isTimeoutOccurred()
      Whether a timeout has occurred during a shutdown.
    • getLoggingLevel

      LoggingLevel getLoggingLevel()
      Gets the logging level used for logging shutdown activity (such as starting and stopping routes). The default logging level is DEBUG.
    • setLoggingLevel

      void setLoggingLevel(LoggingLevel loggingLevel)
      Sets the logging level used for logging shutdown activity (such as starting and stopping routes). The default logging level is DEBUG.