使用springboot optaplanner-spring-boot-starter时如何使用多个ConstraintProviders

问题描述

optaplanner-spring-boot-starter自动发现ContraintProvider,而没有SolverConfig.xml,因此,如果我们要针对多个问题使用多个constrantProvider,例如例如 问题A,需要使用problemAContraintProvider和问题B,需要使用ProblemBContraintProvider ,我可以使用任何限定符类型的注释,并告诉Solvermanger使用特定的ConstraintProvider实现

public class ProblemAConstraintProvider implements ConstraintProvider {

    @Override
    public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
        return new Constraint[] { 
                typeMatch(constraintFactory),timeSlotMatch(constraintFactory),};
    }
}

public class ProblemBConstraintProvider implements ConstraintProvider {

    @Override
    public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
        return new Constraint[] { 
                checkId(constraintFactory),};
    }
}

解决方法

您需要添加一个solverConfig.xml来覆盖寻找ConstraintProvider类的默认行为(然后由于发现两个而导致禁食失败)。

添加src/main/resources/solverConfig.xml(可以在application.properties中定制文件位置),并使其包含以下内容:

<solver>
  <scoreDirectoryFactory>
    <constraintProviderClass>...FirstConstraintProvider</>
  </scoreDirectoryFactory>
</solver>

但是正如Radovan所指出的:我们在同一个Spring Boot应用程序中不支持多次SolverManager / solverConfig注入。那是API的差距。

,

简短的回答是“否”。与can we use multiple @PlanningSolution classes and multiple SolverManager in Springboot optaplanner中的答案类似,每种类型的计划问题都需要一个新的求解器配置,该配置定义了constraintProviderClass

optaplanner-spring-boot-starter仅支持单个求解器配置,因此仅支持单一类型的计划问题。