diff --git a/src/main/java/mate/academy/AsyncRequestProcessor.java b/src/main/java/mate/academy/AsyncRequestProcessor.java index ee5eea1..3412143 100644 --- a/src/main/java/mate/academy/AsyncRequestProcessor.java +++ b/src/main/java/mate/academy/AsyncRequestProcessor.java @@ -1,16 +1,35 @@ 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; public AsyncRequestProcessor(Executor executor) { this.executor = executor; + this.cache = new ConcurrentHashMap<>(); } public CompletableFuture processRequest(String userId) { - return null; + if (cache.containsKey(userId)) { + return CompletableFuture.completedFuture(cache.get(userId)); + } + + return CompletableFuture.supplyAsync(() -> { + try { + Thread.sleep(200); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + return "Details for " + userId; + }, executor).thenApply(details -> { + UserData userData = new UserData(userId, details); + cache.put(userId, userData); + return userData; + }); } } diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index a3c9b9e..a10eee8 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -2,15 +2,14 @@ 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.newCachedThreadPool(); AsyncRequestProcessor asyncRequestProcessor = new AsyncRequestProcessor(executor); - // Simulating multiple concurrent requests - String[] userIds = {"user1", "user2", "user3", "user1"}; // Note: "user1" is repeated + String[] userIds = {"user1", "user2", "user3", "user1"}; CompletableFuture[] futures = new CompletableFuture[userIds.length]; for (int i = 0; i < userIds.length; i++) { @@ -19,7 +18,6 @@ public static void main(String[] args) { .thenAccept(userData -> System.out.println("Processed: " + userData)); } - // Wait for all futures to complete CompletableFuture.allOf(futures).join(); executor.shutdown(); } diff --git a/src/main/java/mate/academy/UserData.java b/src/main/java/mate/academy/UserData.java index ef80432..4321fb1 100644 --- a/src/main/java/mate/academy/UserData.java +++ b/src/main/java/mate/academy/UserData.java @@ -1,5 +1,27 @@ package mate.academy; -public record UserData(String userId, String details) { +public class UserData { + private final String userId; + private String details; + public UserData(String userId, String details) { + this.userId = userId; + this.details = details; + } + + public String userId() { + return userId; + } + + public String details() { + return details; + } + + @Override + public String toString() { + return "UserData{" + + "userId=" + userId + + ", details=" + details + + '}'; + } }