提问人:Moritzslz 提问时间:11/15/2023 最后编辑:markspaceMoritzslz 更新时间:11/15/2023 访问量:54
ConcurrentHashMap 是否是将结果存储在异步应用程序中的良好做法?[关闭]
Is a ConcurrentHashMap good practice for storing results in an async application? [closed]
问:
我目前正在开发一个 Spring 应用程序(作为一个 uni 项目)。我最近遇到了一个问题,如果在请求的 30 秒内未收到 http 响应,我的托管服务会引发超时。
因此,我开始思考如何解决这个问题,因为我在后端有一些 API 调用往往会持续大约 30 秒——这是我无法改变的。所以我实现了这个 WorkerService,但我不确定这是否是好的做法。我在 startBackgroundTask() 方法中进行 API 调用,当调用完成后,我将响应存储在 concurrentHashMap 中,然后我的应用程序的其他部分使用 isWorking()、getResult() 和 closeTask() 方法访问该映射。
我知道 Java 有一个可靠的垃圾收集器,但是我不太确定这是否是应用程序使用的内存等的良好做法。
重要提示:每个用户在使用应用程序时至少调用一次 startBackgroundTask() 方法。
提前感谢您的帮助!
@Service
public class WorkerService {
private final ApiService apiService;
private final ConcurrentHashMap<Long, String> completionStorage; // ensuring thread safety
public WorkerService(ApiService apiService) {
this.apiService = apiService;
this.completionStorage = new ConcurrentHashMap<>();
}
public boolean isWorking(Long userId) {
return !completionStorage.containsKey(userId);
}
public String getResult(Long userId) {
return completionStorage.get(userId);
}
public void closeTask(Long userId) {
completionStorage.remove(userId);
}
@Async("CustomExecutor")
public void startBackgroundTask(ApiRequest request, Long userId) {
// ----------
// Get the API response via the ApiService
// ----------
System.out.println("Started background task for user: " + userId);
ApiResponse response = ApiService.getResponse(request);
String json = response.get(0).getMessage().getJSON();
System.out.println("Finished background task for user: " + userId);
completionStorage.put(userId, json);
}
}
我厌倦了阅读有关异步 Spring 应用程序的信息,但没有找到我问题的答案。
答: 暂无答案
评论