问题描述
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
仅支持单个求解器配置,因此仅支持单一类型的计划问题。