View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.lang3.concurrent;
18  
19  /**
20   * An interface describing a <a
21   * href="https://martinfowler.com/bliki/CircuitBreaker.html">Circuit Breaker</a> component.
22   *
23   * <p>
24   * A <em>circuit breaker</em> can be used to protect an application against unreliable
25   * services or unexpected load. It typically monitors a specific resource. As long as this
26   * resource works as expected, it stays in state <em>closed</em>, meaning that the
27   * resource can be used. If problems are encountered when using the resource, the circuit
28   * breaker can switch into state <em>open</em>; then access to this resource is
29   * prohibited. Depending on a concrete implementation, it is possible that the circuit
30   * breaker switches back to state <em>closed</em> when the resource becomes available
31   * again.
32   * </p>
33   * <p>
34   * This interface defines a generic protocol of a circuit breaker component. It should be
35   * sufficiently generic to be applied to multiple different use cases.
36   * </p>
37   *
38   * @param <T> the type of the value monitored by this circuit breaker
39   * @since 3.5
40   */
41  public interface CircuitBreaker<T> {
42  
43      /**
44       * Checks the state of this circuit breaker and changes it if necessary. The return
45       * value indicates whether the circuit breaker is now in state <em>closed</em>; a value
46       * of <strong>true</strong> typically means that the current operation can continue.
47       *
48       * @return <strong>true</strong> if the circuit breaker is now closed;
49       * <strong>false</strong> otherwise.
50       */
51      boolean checkState();
52  
53      /**
54       * Closes this circuit breaker. Its state is changed to closed. If this circuit
55       * breaker is already closed, this method has no effect.
56       */
57      void close();
58  
59      /**
60       * Increments the monitored value and performs a check of the current state of this
61       * circuit breaker. This method works like {@link #checkState()}, but the monitored
62       * value is incremented before the state check is performed.
63       *
64       * @param increment value to increment in the monitored value of the circuit breaker
65       * @return <strong>true</strong> if the circuit breaker is now closed;
66       * <strong>false</strong> otherwise
67       */
68      boolean incrementAndCheckState(T increment);
69  
70      /**
71       * Tests the current closed state of this circuit breaker. A return value of
72       * <strong>true</strong> means that the circuit breaker is currently closed. This
73       * means that everything is okay with the monitored subsystem.
74       *
75       * @return the current closed state of this circuit breaker.
76       */
77      boolean isClosed();
78  
79      /**
80       * Tests the current open state of this circuit breaker. A return value of
81       * <strong>true</strong> means that the circuit breaker is currently open indicating a
82       * problem in the monitored subsystem.
83       *
84       * @return the current open state of this circuit breaker.
85       */
86      boolean isOpen();
87  
88      /**
89       * Opens this circuit breaker. Its state is changed to open. Depending on a concrete
90       * implementation, it may close itself again if the monitored subsystem becomes
91       * available. If this circuit breaker is already open, this method has no effect.
92       */
93      void open();
94  }