diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index bcedab6..f17654b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -7,10 +7,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- - name: Set up JDK 17
+ - name: Set up JDK 21
uses: actions/setup-java@v4
with:
- java-version: '17'
+ java-version: '21'
distribution: 'temurin'
cache: maven
- name: Build with Maven
diff --git a/pom.xml b/pom.xml
index 981f403..cae55a3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,8 +9,8 @@
1.0-SNAPSHOT
- 17
- 17
+ 21
+ 21
UTF-8
https://raw.githubusercontent.com/mate-academy/style-guides/master/java/checkstyle.xml
diff --git a/src/main/java/mate/academy/AsyncRequestProcessor.java b/src/main/java/mate/academy/AsyncRequestProcessor.java
index ee5eea1..222b86c 100644
--- a/src/main/java/mate/academy/AsyncRequestProcessor.java
+++ b/src/main/java/mate/academy/AsyncRequestProcessor.java
@@ -1,16 +1,46 @@
package mate.academy;
+import java.util.Map;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executor;
public class AsyncRequestProcessor {
private final Executor executor;
+ private final Map cache = new ConcurrentHashMap<>();
public AsyncRequestProcessor(Executor executor) {
this.executor = executor;
}
public CompletableFuture processRequest(String userId) {
- return null;
+ UserData cached = cache.get(userId);
+ if (cached != null) {
+ return CompletableFuture.completedFuture(cached);
+ }
+
+ return fetchUserDataAsync(userId)
+ .thenApply(userData -> saveToCache(userId, userData));
+ }
+
+ private CompletableFuture fetchUserDataAsync(String userId) {
+ return CompletableFuture.supplyAsync(() -> {
+ simulateDatabaseCall();
+ return new UserData(userId, "Details for " + userId);
+ }, this.executor);
+ }
+
+ private UserData saveToCache(String userId, UserData userData) {
+ cache.put(userId, userData);
+ return userData;
+ }
+
+ private void simulateDatabaseCall() {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new RuntimeException("Data fetching interrupted", e);
+ }
}
}
diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java
index a3c9b9e..42e237d 100644
--- a/src/main/java/mate/academy/Main.java
+++ b/src/main/java/mate/academy/Main.java
@@ -2,11 +2,13 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
// Feel free to play with AsyncRequestProcessor in this main method if you want
- ExecutorService executor = null; // Provide implementation that fits your needs
+ ExecutorService executor = Executors.newFixedThreadPool(10); // Provide implementation
+ // that fits your needs
AsyncRequestProcessor asyncRequestProcessor = new AsyncRequestProcessor(executor);
// Simulating multiple concurrent requests