10.4. 创建 resolver 服务
REST 线程上的规划问题会导致 HTTP 超时问题。因此,Quarkus 扩展注入 SolverManager,它会在一个单独的线程池中运行 solvers,并可并行解决多个数据集。
流程
创建 src/main/java/org/acme/optaplanner/rest/TimeTableResource.java
类:
package org.acme.optaplanner.rest; import java.util.UUID; import java.util.concurrent.ExecutionException; import javax.inject.Inject; import javax.ws.rs.POST; import javax.ws.rs.Path; import org.acme.optaplanner.domain.TimeTable; import org.optaplanner.core.api.solver.SolverJob; import org.optaplanner.core.api.solver.SolverManager; @Path("/timeTable") public class TimeTableResource { @Inject SolverManager<TimeTable, UUID> solverManager; @POST @Path("/solve") public TimeTable solve(TimeTable problem) { UUID problemId = UUID.randomUUID(); // Submit the problem to start solving SolverJob<TimeTable, UUID> solverJob = solverManager.solve(problemId, problem); TimeTable solution; try { // Wait until the solving ends solution = solverJob.getFinalBestSolution(); } catch (InterruptedException | ExecutionException e) { throw new IllegalStateException("Solving failed.", e); } return solution; } }
此初始实施会等待 solver 完成,这仍然可能导致 HTTP 超时。完整的实现可避免 HTTP 超时更小。