24
24
25
25
import org .eclipse .microprofile .health .spi .HealthCheckResponseProvider ;
26
26
27
- import java .security .AccessController ;
28
- import java .security .PrivilegedAction ;
29
27
import java .util .Map ;
30
28
import java .util .Optional ;
31
- import java .util .ServiceLoader ;
32
- import java .util .logging .Level ;
33
29
import java .util .logging .Logger ;
34
30
35
31
/**
36
32
* The response to a health check invocation.
37
33
* <p>
38
34
* The {@link HealthCheckResponse} class is reserved for an extension by implementation providers.
39
- * An application should use one of the static methods to create a Response instance using a
35
+ * An application should use one of the static methods to create a Response instance using a
40
36
* {@link HealthCheckResponseBuilder}.
41
37
* When used on the consuming end, The class can also be instantiated directly.
42
38
* </p>
@@ -45,8 +41,6 @@ public class HealthCheckResponse {
45
41
46
42
private static final Logger LOGGER = Logger .getLogger (HealthCheckResponse .class .getName ());
47
43
48
- private static volatile HealthCheckResponseProvider provider = null ;
49
-
50
44
private final String name ;
51
45
52
46
private final Status status ;
@@ -78,9 +72,10 @@ public HealthCheckResponse() {
78
72
* Used by OSGi environment where the service loader pattern is not supported.
79
73
*
80
74
* @param provider the provider instance to use.
75
+ * @deprecated use {{@link HealthCheckResponseProviderResolver#setProvider}} instead
81
76
*/
82
77
public static void setResponseProvider (HealthCheckResponseProvider provider ) {
83
- HealthCheckResponse . provider = provider ;
78
+ HealthCheckResponseProviderResolver . setProvider ( provider ) ;
84
79
}
85
80
86
81
/**
@@ -91,7 +86,7 @@ public static void setResponseProvider(HealthCheckResponseProvider provider) {
91
86
*/
92
87
public static HealthCheckResponseBuilder named (String name ) {
93
88
94
- return getProvider ().createResponseBuilder ().name (name );
89
+ return HealthCheckResponseProviderResolver . getProvider ().createResponseBuilder ().name (name );
95
90
}
96
91
97
92
/**
@@ -102,12 +97,12 @@ public static HealthCheckResponseBuilder named(String name) {
102
97
* @return a new, empty health check builder
103
98
*/
104
99
public static HealthCheckResponseBuilder builder () {
105
- return getProvider ().createResponseBuilder ();
100
+ return HealthCheckResponseProviderResolver . getProvider ().createResponseBuilder ();
106
101
}
107
102
108
103
/**
109
104
* Creates a successful health check with a name.
110
- *
105
+ *
111
106
* @param name the check name
112
107
* @return a new sucessful health check response with a name
113
108
*/
@@ -117,33 +112,14 @@ public static HealthCheckResponse up(String name) {
117
112
118
113
/**
119
114
* Creates a failed health check with a name.
120
- *
115
+ *
121
116
* @param name the check name
122
117
* @return a new failed health check response with a name
123
118
*/
124
119
public static HealthCheckResponse down (String name ) {
125
120
return HealthCheckResponse .named (name ).down ().build ();
126
121
}
127
122
128
- private static HealthCheckResponseProvider getProvider () {
129
- if (provider == null ) {
130
- synchronized (HealthCheckResponse .class ) {
131
- if (provider != null ) {
132
- return provider ;
133
- }
134
-
135
- HealthCheckResponseProvider newInstance = find (HealthCheckResponseProvider .class );
136
-
137
- if (newInstance == null ) {
138
- throw new IllegalStateException ("No HealthCheckResponseProvider implementation found!" );
139
- }
140
-
141
- provider = newInstance ;
142
- }
143
- }
144
- return provider ;
145
- }
146
-
147
123
// the actual contract
148
124
149
125
public enum Status {UP , DOWN }
@@ -160,61 +136,4 @@ public Optional<Map<String, Object>> getData() {
160
136
return data ;
161
137
}
162
138
163
- private static <T > T find (Class <T > service ) {
164
-
165
- T serviceInstance = find (service , HealthCheckResponse .getContextClassLoader ());
166
-
167
- // alternate classloader
168
- if (null == serviceInstance ) {
169
- serviceInstance = find (service , HealthCheckResponse .class .getClassLoader ());
170
- }
171
-
172
- // service cannot be found
173
- if (null == serviceInstance ) {
174
- throw new IllegalStateException ("Unable to find service " + service .getName ());
175
- }
176
-
177
- return serviceInstance ;
178
- }
179
-
180
- private static <T > T find (Class <T > service , ClassLoader cl ) {
181
-
182
- T serviceInstance = null ;
183
-
184
- try {
185
- ServiceLoader <T > services = ServiceLoader .load (service , cl );
186
-
187
- for (T spi : services ) {
188
- if (serviceInstance != null ) {
189
- throw new IllegalStateException (
190
- "Multiple service implementations found: "
191
- + spi .getClass ().getName () + " and "
192
- + serviceInstance .getClass ().getName ());
193
- }
194
- serviceInstance = spi ;
195
- }
196
- }
197
- catch (Throwable t ) {
198
- LOGGER .log (Level .SEVERE , "Error loading service " + service .getName () + "." , t );
199
- }
200
-
201
- return serviceInstance ;
202
- }
203
-
204
-
205
- private static ClassLoader getContextClassLoader () {
206
- return AccessController .doPrivileged ((PrivilegedAction <ClassLoader >) () -> {
207
- ClassLoader cl = null ;
208
- try {
209
- cl = Thread .currentThread ().getContextClassLoader ();
210
- }
211
- catch (SecurityException ex ) {
212
- LOGGER .log (
213
- Level .WARNING ,
214
- "Unable to get context classloader instance." ,
215
- ex );
216
- }
217
- return cl ;
218
- });
219
- }
220
139
}
0 commit comments