Skip to content

Commit e584969

Browse files
authored
Merge pull request #1279 from amihaiemil/1278
#1278 global http client
2 parents 753a9bc + d9f810f commit e584969

File tree

2 files changed

+84
-64
lines changed

2 files changed

+84
-64
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.selfxdsd.core;
2+
3+
import java.net.http.HttpClient;
4+
import java.time.Duration;
5+
6+
/**
7+
* Global singleton {@link java.net.http.HttpClient} to be used for making
8+
* HTTP Requests throughout the application, especially to the providers'
9+
* APIs (Github, Gitlab, BitBucket etc).
10+
*/
11+
public final class GlobalHttpClient {
12+
13+
/**
14+
* The HttpClient.
15+
*/
16+
private static HttpClient client;
17+
18+
/**
19+
* Hidden ctor.
20+
*/
21+
private GlobalHttpClient() {}
22+
23+
/**
24+
* Get the instance of the HttpClient.
25+
* @param version HTTP Version 1.1 or 2.
26+
* @return HttpClient.
27+
*/
28+
public static HttpClient instance(final HttpClient.Version version) {
29+
if(client == null || !client.version().equals(version)) {
30+
client = HttpClient
31+
.newBuilder()
32+
.version(version)
33+
.followRedirects(HttpClient.Redirect.NORMAL)
34+
.connectTimeout(Duration.ofSeconds(10))
35+
.build();
36+
}
37+
return client;
38+
}
39+
}

self-core-impl/src/main/java/com/selfxdsd/core/JsonResources.java

Lines changed: 45 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,7 @@
3535
import java.net.http.HttpHeaders;
3636
import java.net.http.HttpRequest;
3737
import java.net.http.HttpResponse;
38-
import java.time.Duration;
3938
import java.util.*;
40-
import java.util.concurrent.ExecutorService;
41-
import java.util.concurrent.Executors;
4239
import java.util.function.Supplier;
4340

4441
/**
@@ -269,10 +266,16 @@ public Resource get(
269266
final URI uri,
270267
final Supplier<Map<String, List<String>>> headers
271268
) {
272-
final ExecutorService exec = Executors.newSingleThreadExecutor();
273-
HttpClient client = this.newHttpClient(exec);
274269
try {
275-
final HttpResponse<String> response = client.send(
270+
final HttpClient.Version version;
271+
if(this.useOldHttpProtocol) {
272+
version = HttpClient.Version.HTTP_1_1;
273+
} else {
274+
version = HttpClient.Version.HTTP_2;
275+
}
276+
final HttpResponse<String> response = GlobalHttpClient.instance(
277+
version
278+
).send(
276279
this.request(
277280
uri,
278281
"GET",
@@ -291,10 +294,6 @@ public Resource get(
291294
"Couldn't GET [" + uri.toString() +"]",
292295
ex
293296
);
294-
} finally {
295-
exec.shutdownNow();
296-
client = null;
297-
System.gc();
298297
}
299298
}
300299

@@ -304,10 +303,16 @@ public Resource post(
304303
final Supplier<Map<String, List<String>>> headers,
305304
final JsonValue body
306305
) {
307-
final ExecutorService exec = Executors.newSingleThreadExecutor();
308-
HttpClient client = this.newHttpClient(exec);
309306
try {
310-
final HttpResponse<String> response = client.send(
307+
final HttpClient.Version version;
308+
if(this.useOldHttpProtocol) {
309+
version = HttpClient.Version.HTTP_1_1;
310+
} else {
311+
version = HttpClient.Version.HTTP_2;
312+
}
313+
final HttpResponse<String> response = GlobalHttpClient.instance(
314+
version
315+
).send(
311316
this.request(
312317
uri,
313318
"POST",
@@ -329,10 +334,6 @@ public Resource post(
329334
+ " to [" + uri.toString() +"]",
330335
ex
331336
);
332-
} finally {
333-
exec.shutdownNow();
334-
client = null;
335-
System.gc();
336337
}
337338
}
338339

@@ -342,10 +343,16 @@ public Resource patch(
342343
final Supplier<Map<String, List<String>>> headers,
343344
final JsonValue body
344345
) {
345-
final ExecutorService exec = Executors.newSingleThreadExecutor();
346-
HttpClient client = this.newHttpClient(exec);
347346
try {
348-
final HttpResponse<String> response = client.send(
347+
final HttpClient.Version version;
348+
if(this.useOldHttpProtocol) {
349+
version = HttpClient.Version.HTTP_1_1;
350+
} else {
351+
version = HttpClient.Version.HTTP_2;
352+
}
353+
final HttpResponse<String> response = GlobalHttpClient.instance(
354+
version
355+
).send(
349356
this.request(
350357
uri,
351358
"PATCH",
@@ -367,10 +374,6 @@ public Resource patch(
367374
+ " at [" + uri.toString() +"]",
368375
ex
369376
);
370-
} finally {
371-
exec.shutdownNow();
372-
client = null;
373-
System.gc();
374377
}
375378
}
376379

@@ -380,10 +383,16 @@ public Resource put(
380383
final Supplier<Map<String, List<String>>> headers,
381384
final JsonValue body
382385
) {
383-
final ExecutorService exec = Executors.newSingleThreadExecutor();
384-
HttpClient client = this.newHttpClient(exec);
385386
try {
386-
final HttpResponse<String> response = client.send(
387+
final HttpClient.Version version;
388+
if(this.useOldHttpProtocol) {
389+
version = HttpClient.Version.HTTP_1_1;
390+
} else {
391+
version = HttpClient.Version.HTTP_2;
392+
}
393+
final HttpResponse<String> response = GlobalHttpClient.instance(
394+
version
395+
).send(
387396
this.request(
388397
uri,
389398
"PUT",
@@ -405,10 +414,6 @@ public Resource put(
405414
+ " at [" + uri.toString() +"]",
406415
ex
407416
);
408-
} finally {
409-
exec.shutdownNow();
410-
client = null;
411-
System.gc();
412417
}
413418
}
414419

@@ -418,10 +423,16 @@ public Resource delete(
418423
final Supplier<Map<String, List<String>>> headers,
419424
final JsonValue body
420425
) {
421-
final ExecutorService exec = Executors.newSingleThreadExecutor();
422-
HttpClient client = this.newHttpClient(exec);
423426
try {
424-
final HttpResponse<String> response = client.send(
427+
final HttpClient.Version version;
428+
if(this.useOldHttpProtocol) {
429+
version = HttpClient.Version.HTTP_1_1;
430+
} else {
431+
version = HttpClient.Version.HTTP_2;
432+
}
433+
final HttpResponse<String> response = GlobalHttpClient.instance(
434+
version
435+
).send(
425436
this.request(
426437
uri,
427438
"DELETE",
@@ -443,10 +454,6 @@ public Resource delete(
443454
+ " at [" + uri.toString() +"]",
444455
ex
445456
);
446-
} finally {
447-
exec.shutdownNow();
448-
client = null;
449-
System.gc();
450457
}
451458
}
452459

@@ -495,32 +502,6 @@ private HttpRequest request(
495502
return requestBuilder.build();
496503
}
497504

498-
/**
499-
* Creates a new http client.
500-
* @param executor ExecutorService to use internally and close on end.
501-
* @return HttpClient.
502-
*/
503-
private HttpClient newHttpClient(final ExecutorService executor) {
504-
final HttpClient client;
505-
if (this.useOldHttpProtocol) {
506-
client = HttpClient
507-
.newBuilder()
508-
.version(HttpClient.Version.HTTP_1_1)
509-
.followRedirects(HttpClient.Redirect.NORMAL)
510-
.connectTimeout(Duration.ofSeconds(10))
511-
.executor(executor)
512-
.build();
513-
} else {
514-
client = HttpClient
515-
.newBuilder()
516-
.followRedirects(HttpClient.Redirect.NORMAL)
517-
.connectTimeout(Duration.ofSeconds(10))
518-
.executor(executor)
519-
.build();
520-
}
521-
return client;
522-
}
523-
524505
/**
525506
* Calling HttpHeaders.map() will return a Map<String, List<String>>,
526507
* BUT it will not split the header's value by comma. We have to do

0 commit comments

Comments
 (0)