首页 > 解决方案 > 在使用springboot optaplanner-spring-boot-starter时,我们如何使用多个ConstraintProviders

问题描述

optaplanner-spring-boot-starter 自动发现ContraintProvider,没有solverConfig.xml,所以如果我们想为不同的问题使用多个constrantProviders,例如 问题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),
    
                };
    }
}

标签: javaspring-bootoptaplanner

解决方案


您需要添加一个solverConfig.xml来覆盖查找ConstraintProvider类的默认行为(然后禁食失败,因为它找到了两个)。

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

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

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


推荐阅读