OptaPlanner parallelSolverCount正确配置及报错处理
问题原因
你当前配置不生效的核心原因是配置层级错误:<solverManagerConfig>不属于<solver>标签的嵌套子节点,你把它写在solver标签内部时,OptaPlanner解析配置会直接忽略这个节点,导致parallelSolverCount的设置完全没有被加载,自然不会触发任务排队逻辑。
parallelSolverCount 正确XML配置语法
<solverManagerConfig>是和<solver>平级的根级配置节点,正确配置示例如下:
<!-- solverManager全局配置和solver节点平级,不要嵌套到solver内部 --> <solverManagerConfig> <!-- 取值可以是固定正整数,也可以填AVAILABLE_PROCESSOR_COUNT表示匹配CPU可用核心数 --> <parallelSolverCount>1</parallelSolverCount> </solverManagerConfig> <solver> <!-- 此处为原有求解器内部配置,包括实体类、评分规则、终止条件等内容 --> .... </solver>
报错解决方案
你遇到的java.lang.IllegalStateException: The problemId (1) is already solving异常可以通过两个步骤彻底解决:
- 修正配置层级:按照上面的示例把
<solverManagerConfig>移到和<solver>平级的位置,保证parallelSolverCount配置被正确加载。配置生效后,当正在执行的求解任务数达到parallelSolverCount阈值时,新提交的任务会自动进入队列等待,不会直接触发执行冲突。 - 保证problemId全局唯一:该异常的直接触发条件是同一个SolverManager实例下,你提交求解任务时传入了重复的problemId。哪怕并行数配置正确,只要某个problemId对应的任务还在执行/排队状态,重复使用同一个id提交任务就会抛出该异常。批量提交任务时不要复用固定id值(比如你报错中使用的固定id=1),需要为每个独立求解任务分配唯一的problemId。
补充注意:如果你是手动通过
SolverManagerFactory创建SolverManager实例,需要确保创建实例时加载的配置源包含上述solverManagerConfig节点,不要仅加载solver部分的配置片段。
内容的提问来源于stack exchange,提问作者elk-tamer
相关产品推荐
相关产品推荐

