ConcurrentHashMap 是否是将结果存储在异步应用程序中的良好做法?[关闭]

Is a ConcurrentHashMap good practice for storing results in an async application? [closed]

提问人:Moritzslz 提问时间:11/15/2023 最后编辑:markspaceMoritzslz 更新时间:11/15/2023 访问量:54

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

6天前关闭。

我目前正在开发一个 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 应用程序的信息,但没有找到我问题的答案。

Java Spring 异步 内存管理 backgroundworker

评论


答: 暂无答案