From a92e1146384d4b792b580112de28e7bfef4726dc Mon Sep 17 00:00:00 2001 From: Illya Pantazi Date: Sun, 1 Mar 2026 08:16:47 +0100 Subject: [PATCH] Implemented a method processRequest(String userId) that simulates processing a user request based on their userId --- .../mate/academy/AsyncRequestProcessor.java | 23 ++++++++++++++++++- src/main/java/mate/academy/Main.java | 3 ++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/mate/academy/AsyncRequestProcessor.java b/src/main/java/mate/academy/AsyncRequestProcessor.java index ee5eea1..6e82689 100644 --- a/src/main/java/mate/academy/AsyncRequestProcessor.java +++ b/src/main/java/mate/academy/AsyncRequestProcessor.java @@ -1,16 +1,37 @@ 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 userData = cache.get(userId); + if (userData != null) { + return CompletableFuture.completedFuture(userData); + } + + return CompletableFuture.supplyAsync( + () -> cache.computeIfAbsent(userId, this::processUserData), + executor + ); + } + + private UserData processUserData(String userId) { + try { + Thread.sleep(1000); // Simulate processing delay + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException(e); + } + return new UserData(userId, "Details for " + userId); } } diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index a3c9b9e..cca6e9a 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -2,11 +2,12 @@ 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(5); AsyncRequestProcessor asyncRequestProcessor = new AsyncRequestProcessor(executor); // Simulating multiple concurrent requests