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 * https://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 }