1 /*
2  * Hunt - A refined core library for D programming language.
3  *
4  * Copyright (C) 2018-2019 HuntLabs
5  *
6  * Website: https://www.huntlabs.net/
7  *
8  * Licensed under the Apache-2.0 License.
9  *
10  */
11 
12 module hunt.util.Lifecycle;
13 
14 import core.atomic;
15 
16 
17 import hunt.logging;
18 
19 /**
20  * A common interface defining methods for start/stop lifecycle control.
21  * The typical use case for this is to control asynchronous processing.
22  * <b>NOTE: This interface does not imply specific auto-startup semantics.
23  * Consider implementing {@link SmartLifecycle} for that purpose.</b>
24  *
25  * <p>Can be implemented by both components (typically a Spring bean defined in a
26  * Spring context) and containers  (typically a Spring {@link ApplicationContext}
27  * itself). Containers will propagate start/stop signals to all components that
28  * apply within each container, e.g. for a stop/restart scenario at runtime.
29  *
30  * <p>Can be used for direct invocations or for management operations via JMX.
31  * In the latter case, the {@link org.springframework.jmx.export.MBeanExporter}
32  * will typically be defined with an
33  * {@link org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler},
34  * restricting the visibility of activity-controlled components to the Lifecycle
35  * interface.
36  *
37  * <p>Note that the present {@code Lifecycle} interface is only supported on
38  * <b>top-level singleton beans</b>. On any other component, the {@code Lifecycle}
39  * interface will remain undetected and hence ignored. Also, note that the extended
40  * {@link SmartLifecycle} interface provides sophisticated integration with the
41  * application context's startup and shutdown phases.
42  *
43  */
44 interface Lifecycle {
45 	/**
46 	 * Start this component.
47 	 * <p>Should not throw an exception if the component is already running.
48 	 * <p>In the case of a container, this will propagate the start signal to all
49 	 * components that apply.
50 	 */    
51 	void start();
52 
53 	/**
54 	 * Stop this component, typically in a synchronous fashion, such that the component is
55 	 * fully stopped upon return of this method. Consider implementing {@link SmartLifecycle}
56 	 * and its {@code stop(Runnable)} variant when asynchronous stop behavior is necessary.
57 	 * <p>Note that this stop notification is not guaranteed to come before destruction:
58 	 * On regular shutdown, {@code Lifecycle} beans will first receive a stop notification
59 	 * before the general destruction callbacks are being propagated; however, on hot
60 	 * refresh during a context's lifetime or on aborted refresh attempts, a given bean's
61 	 * destroy method will be called without any consideration of stop signals upfront.
62 	 * <p>Should not throw an exception if the component is not running (not started yet).
63 	 * <p>In the case of a container, this will propagate the stop signal to all components
64 	 * that apply.
65 	 */
66 	void stop();
67 
68 
69 	/**
70 	 * Check whether this component is currently running.
71 	 * <p>In the case of a container, this will return {@code true} only if <i>all</i>
72 	 * components that apply are currently running.
73 	 * @return whether the component is currently running
74 	 */
75 	bool isRunning();
76 }