Skip to content

Commit 4211a05

Browse files
author
Soroosh Sarabadani
committed
inject HttpClient
1 parent 7ad7277 commit 4211a05

File tree

4 files changed

+107
-96
lines changed

4 files changed

+107
-96
lines changed

examples/simple-http-resource.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ spec:
88
sourceType: http
99
targetConfigMapName: http-config
1010
sourceConfig:
11-
url: https://opentable.herokuapp.com/api/cities
11+
url: https://jsonplaceholder.typicode.com/todos
1212
intervalSeconds: 10

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
-H:ReflectionConfigurationFiles=reflection-config.json , -H:ResourceConfigurationFiles=resources-config.json
3535
</quarkus.native.additional-build-args>
3636
<surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
37-
<javaoperatorsdk.version>1.3.1-SNAPSHOT</javaoperatorsdk.version>
37+
<javaoperatorsdk.version>1.4.1-SNAPSHOT</javaoperatorsdk.version>
3838
<javassist.version>3.27.0-GA</javassist.version>
3939
</properties>
4040
<dependencyManagement>

src/main/java/com/javaworm/configme/HttpResourceScheduler.java

Lines changed: 70 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22

33
import com.javaworm.configme.resources.ConfigSourceResource;
44
import com.javaworm.configme.sources.HttpSourceConfig;
5-
import org.slf4j.Logger;
6-
import org.slf4j.LoggerFactory;
7-
85
import java.io.IOException;
96
import java.net.URI;
107
import java.net.http.HttpClient;
@@ -14,79 +11,87 @@
1411
import java.util.Timer;
1512
import java.util.TimerTask;
1613
import java.util.concurrent.ConcurrentHashMap;
14+
import org.slf4j.Logger;
15+
import org.slf4j.LoggerFactory;
1716

1817
public class HttpResourceScheduler implements ResourceScheduler {
19-
private static final Logger log = LoggerFactory.getLogger(HttpResourceScheduler.class);
20-
private final HttpClient client = HttpClient
21-
.newBuilder()
22-
.followRedirects(HttpClient.Redirect.NORMAL)
23-
.build();
18+
private static final Logger log = LoggerFactory.getLogger(HttpResourceScheduler.class);
19+
private final HttpClient client;
2420

25-
private final FetchedDataHandler fetchedDataHandler;
26-
private final Timer timer = new Timer(HttpResourceScheduler.class.getName());
27-
private final Map<String, TimerTask> resourceTimers = new ConcurrentHashMap<>();
21+
private final FetchedDataHandler fetchedDataHandler;
22+
private final Timer timer = new Timer(HttpResourceScheduler.class.getName());
23+
private final Map<String, TimerTask> resourceTimers = new ConcurrentHashMap<>();
2824

29-
public HttpResourceScheduler(FetchedDataHandler fetchedDataHandler) {
30-
this.fetchedDataHandler = fetchedDataHandler;
31-
}
25+
public HttpResourceScheduler(FetchedDataHandler fetchedDataHandler,HttpClient httpClient) {
26+
this.fetchedDataHandler = fetchedDataHandler;
27+
this.client= httpClient;
28+
}
3229

33-
public void schedule(ConfigSource<HttpSourceConfig> configSource) {
34-
cancelCurrentTask(configSource);
35-
final var url = configSource.getSourceConfig().getUrl();
36-
final var intervalSeconds = configSource.getSourceConfig().getIntervalSeconds();
37-
final var intervalMilliseconds = (int) (intervalSeconds * 1000.0);
38-
final TimerTask task = new TimerTask() {
39-
@Override
40-
public void run() {
41-
log.debug("Fetching data from {}", url);
42-
final var request = HttpRequest.newBuilder().uri(URI.create(url)).GET().build();
43-
try {
44-
final HttpResponse<String> response;
45-
response = client.send(request, HttpResponse.BodyHandlers.ofString());
46-
if (response.statusCode() < 200 || response.statusCode() > 299) {
47-
log.warn("Fetching data from url {} failed with status code {} and body {}", url, response.statusCode(), response.body());
48-
return;
49-
}
50-
final var body = response.body();
30+
public void schedule(ConfigSource<HttpSourceConfig> configSource) {
31+
cancelCurrentTask(configSource);
32+
final var url = configSource.getSourceConfig().getUrl();
33+
final var intervalSeconds = configSource.getSourceConfig().getIntervalSeconds();
34+
final var intervalMilliseconds = (int) (intervalSeconds * 1000.0);
35+
final TimerTask task =
36+
new TimerTask() {
37+
@Override
38+
public void run() {
39+
log.debug("Fetching data from {}", url);
40+
final var request = HttpRequest.newBuilder().uri(URI.create(url)).GET().build();
41+
try {
42+
final HttpResponse<String> response;
43+
response = client.send(request, HttpResponse.BodyHandlers.ofString());
44+
if (response.statusCode() < 200 || response.statusCode() > 299) {
45+
configSource.getContext().emit("Error");
46+
log.warn(
47+
"Fetching data from url {} failed with status code {} and body {}",
48+
url,
49+
response.statusCode(),
50+
response.body());
51+
return;
52+
}
53+
final var body = response.body();
5154

52-
fetchedDataHandler.handle(configSource, body);
53-
} catch (IOException | InterruptedException e) {
54-
log.error("Error in fetching data from " + url, e);
55-
}
55+
fetchedDataHandler.handle(configSource, body);
56+
} catch (IOException | InterruptedException e) {
57+
configSource.getContext().emit("Error");
58+
log.error("Error in fetching data from " + url, e);
5659
}
60+
}
5761
};
5862

59-
timer.schedule(task, 0, intervalMilliseconds);
60-
resourceTimers.put(configSource.getUid(), task);
61-
log.info("Config source {} scheduled to refresh every {}s", configSource.getName(), intervalSeconds);
62-
}
63+
timer.schedule(task, 0, intervalMilliseconds);
64+
resourceTimers.put(configSource.getUid(), task);
65+
log.info(
66+
"Config source {} scheduled to refresh every {}s", configSource.getName(), intervalSeconds);
67+
}
6368

64-
private void cancelCurrentTask(ConfigSource<HttpSourceConfig> configSource) {
65-
final var uid = configSource.getUid();
66-
final var currentTimerTask = resourceTimers.get(uid);
67-
if (currentTimerTask == null) {
68-
log.info("Resource with UID [{}] has no task yet!", uid);
69-
return;
70-
}
71-
log.info("Canceling task for Resource UID [{}]", uid);
72-
final var cancellationResult = currentTimerTask.cancel();
73-
log.info("Canceling task result [{}]", cancellationResult);
74-
if (cancellationResult) {
75-
resourceTimers.remove(uid);
76-
}
69+
private void cancelCurrentTask(ConfigSource<HttpSourceConfig> configSource) {
70+
final var uid = configSource.getUid();
71+
final var currentTimerTask = resourceTimers.get(uid);
72+
if (currentTimerTask == null) {
73+
log.debug("Resource with UID [{}] has no task yet!", uid);
74+
return;
7775
}
76+
log.debug("Canceling task for Resource UID [{}]", uid);
77+
final var cancellationResult = currentTimerTask.cancel();
78+
log.debug("Canceling task result [{}]", cancellationResult);
79+
if (cancellationResult) {
80+
resourceTimers.remove(uid);
81+
}
82+
}
7883

79-
@Override
80-
public void cancel(RequestContext<ConfigSourceResource> context) {
81-
final var uid = context.getResource().getMetadata().getUid();
82-
final var timerTask = resourceTimers.get(uid);
83-
if (timerTask != null) {
84-
log.info("Canceling task for Resource UID [{}]", uid);
85-
final var cancellationResult = timerTask.cancel();
86-
log.info("Canceling task result for UID [{}] is [{}]", uid, cancellationResult);
87-
if (cancellationResult) {
88-
resourceTimers.remove(uid);
89-
}
90-
}
84+
@Override
85+
public void cancel(RequestContext<ConfigSourceResource> context) {
86+
final var uid = context.getResource().getMetadata().getUid();
87+
final var timerTask = resourceTimers.get(uid);
88+
if (timerTask != null) {
89+
log.debug("Canceling task for Resource UID [{}]", uid);
90+
final var cancellationResult = timerTask.cancel();
91+
log.debug("Canceling task result for UID [{}] is [{}]", uid, cancellationResult);
92+
if (cancellationResult) {
93+
resourceTimers.remove(uid);
94+
}
9195
}
96+
}
9297
}

src/main/java/com/javaworm/configme/ResourceSchedulerManager.java

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,45 @@
22

33
import com.javaworm.configme.resources.ConfigSourceResource;
44
import io.fabric8.kubernetes.client.KubernetesClient;
5-
5+
import java.net.http.HttpClient;
66
import java.util.Map;
77

88
public class ResourceSchedulerManager {
9-
private final ConfigSourceFactory configSourceFactory;
10-
11-
private final Map<String, ResourceScheduler> sourceTypeSchedulers;
12-
13-
public ResourceSchedulerManager(ConfigSourceFactory configSourceFactory, KubernetesClient k8sClient, FetchedDataHandler fetchedDataHandler) {
14-
this.configSourceFactory = configSourceFactory;
15-
sourceTypeSchedulers = Map.of(
16-
"http", new HttpResourceScheduler(fetchedDataHandler)
17-
);
9+
private final ConfigSourceFactory configSourceFactory;
10+
11+
private final Map<String, ResourceScheduler> sourceTypeSchedulers;
12+
13+
public ResourceSchedulerManager(
14+
ConfigSourceFactory configSourceFactory,
15+
KubernetesClient k8sClient,
16+
FetchedDataHandler fetchedDataHandler) {
17+
this.configSourceFactory = configSourceFactory;
18+
sourceTypeSchedulers =
19+
Map.of(
20+
"http",
21+
new HttpResourceScheduler(
22+
fetchedDataHandler,
23+
HttpClient.newBuilder().followRedirects(HttpClient.Redirect.NORMAL).build()));
24+
}
25+
26+
public void schedule(RequestContext<ConfigSourceResource> context) {
27+
cancelExistingScheduleFor(context);
28+
final var configSource = this.configSourceFactory.create(context);
29+
final var sourceType = configSource.getSourceType();
30+
final var scheduler = sourceTypeSchedulers.get(sourceType);
31+
if (scheduler == null) {
32+
final var errorMessage = String.format("No scheduler found for source type [%s]", sourceType);
33+
context.emit(errorMessage);
34+
throw new RuntimeException(errorMessage);
1835
}
36+
scheduler.schedule(configSource);
37+
}
1938

20-
public void schedule(RequestContext<ConfigSourceResource> context) {
21-
cancelExistingScheduleFor(context);
22-
final var configSource = this.configSourceFactory.create(context);
23-
final var sourceType = configSource.getSourceType();
24-
final var scheduler = sourceTypeSchedulers.get(sourceType);
25-
if (scheduler == null) {
26-
final var errorMessage = String.format("No scheduler found for source type [%s]", sourceType);
27-
context.emit(errorMessage);
28-
throw new RuntimeException(errorMessage);
29-
}
30-
scheduler.schedule(configSource);
31-
}
39+
public void cleanup(RequestContext<ConfigSourceResource> context) {
40+
cancelExistingScheduleFor(context);
41+
}
3242

33-
public void cleanup(RequestContext<ConfigSourceResource> context) {
34-
cancelExistingScheduleFor(context);
35-
}
36-
37-
private void cancelExistingScheduleFor(RequestContext<ConfigSourceResource> context) {
38-
sourceTypeSchedulers.values().forEach(scheduler -> scheduler.cancel(context));
39-
}
43+
private void cancelExistingScheduleFor(RequestContext<ConfigSourceResource> context) {
44+
sourceTypeSchedulers.values().forEach(scheduler -> scheduler.cancel(context));
45+
}
4046
}

0 commit comments

Comments
 (0)