首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OptaPlanner线程不会在SpringBoot应用程序中释放

OptaPlanner线程不会在SpringBoot应用程序中释放
EN

Stack Overflow用户
提问于 2022-02-25 08:58:22
回答 2查看 74关注 0票数 0

我们使用Spring中的OptaPlanner(8.2.0)库来解决背包问题,使用构造启发式算法。在运行应用程序时,我们观察到,即使在解决了问题之后,SolverManager创建的线程也不会被释放。正因为如此,应用程序的性能在一段时间后开始下降。此外,求解器管理器开始缓慢响应增加的线程计数。

我们也尝试了最新版本(8.17.0),但问题仍然存在。

终止条件:

代码语言:javascript
运行
复制
<termination>
        <millisecondsSpentLimit>200</millisecondsSpentLimit>
</termination>
代码语言:javascript
运行
复制
optaplanner:
  solver:
    termination:
      best-score-limit: 0hard/*soft

代码:

代码语言:javascript
运行
复制
@Component
@Slf4j
public class SolutionManager {
    private final SolverManager<Solution, String> solutionManager;

    public SolutionManager(SolverManager<Solution, String> solutionManager) {
        this.solutionManager = solutionManager;
    }

    public Solution getSolutionResponse(String solutionId, Solution unsolvedProblem)
            throws InterruptedException, ExecutionException {
        SolverJob<Solution, String> solve = solutionManager.solve(solutionId, unsolvedProblem);
        Solution finalBestSolution = solve.getFinalBestSolution();

        return finalBestSolution;
    }
}

线程度量:

EN

回答 2

Stack Overflow用户

发布于 2022-02-25 10:46:25

我无法重现这个问题;在并行地解决了几个数据集所表示的负载之后,线程数量下降到与加载开始前相同的值。

您共享的图表也不清楚地表明存在线程泄漏;如果您查看~12:40 PM并将其与~2:00 PM进行比较,那么线程的数量实际上确实减少了。

还让我补充一下,getFinalBestSolution()方法实际上阻止调用线程,直到求解器完成为止。如果使用solve(ProblemId_ problemId, Solution_ problem, Consumer finalBestSolutionConsumer),则此方法将立即返回,并且在求解器完成时将调用您提供的Consumer

票数 1
EN

Stack Overflow用户

发布于 2022-03-09 07:54:55

看起来您可能没有使用OptaPlanner Spring。

如果是这样的话,升级到最新版本的OptaPlanner并向optaplanner-spring-boot-starter添加一个依赖项。有关如何使用该库的示例,请参阅docs spring和存储库(在目录技术中)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71263355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档