14.4. 创建 solver 服务

解决 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 超时很多。