Optaplanner开启多线程报The externalObject has no known workingObject异常如何解决
异常原因
OptaPlanner开启多线程求解时,会为每个工作线程克隆独立的求解副本以避免线程干扰。你当前的问题事实类ReforgeProblemFact仅作为规划实体ItemPlanningEntity的内部属性存在,没有直接在顶层的规划解决方案类ReforgePlanningSolution中通过@ProblemFactCollectionProperty注解注册。多线程克隆阶段,OptaPlanner仅会索引解决方案顶层注册的问题事实,实体内部的问题事实没有被纳入全局工作副本索引,因此抛出找不到对应workingObject的异常。单线程模式下无需克隆求解副本,所以不会触发该问题。
修复步骤
步骤1:修改规划解决方案类,新增顶层问题事实注册属性
更新ReforgePlanningSolution.kt代码,添加全局的重铸问题事实集合,并用@ProblemFactCollectionProperty注解标注:
@PlanningSolution class ReforgePlanningSolution @JvmOverloads constructor( @PlanningEntityCollectionProperty val availableItems: List<ItemPlanningEntity>? = null, // 新增:顶层注册所有重铸问题事实 @ProblemFactCollectionProperty val allReforges: List<ReforgeProblemFact>? = null, @PlanningScore val score: HardSoftScore? = null, )
步骤2:构造解决方案实例时传入全局问题事实
修改Main.kt中初始化ReforgePlanningSolution的代码,将全局的allReforges传入构造函数:
val solverJob = solverManager.solve(UUID.randomUUID(), ReforgePlanningSolution(availableItems, allReforges))
修改完成后重新运行即可正常开启多线程求解,原有业务逻辑无需调整。
内容的提问来源于stack exchange,提问作者Gabriel Pizarro
相关产品推荐
相关产品推荐

