如何解决从 org.drools.modelcompiler.builder.generator.expressiontyper.ExpressionTyper
我今天花了很多时间解决了从 Optaplanner 7.48 迁移到 Optaplanner 8.3.0 时出现的问题。在我看来,问题实际上出在 Optaplanner 8.3 所依赖的 Drools 7.50 版本中。
rule "applyHomeTeamConstraints"
enabled true
when $f1: ProblemFixture(slot != null,$ht: homeTeam)
$tu: ProblemSoftConstraint(this memberOf $ht.constraints,matches($f1.slot.dateTime) )
then
scoreHolder.penalize(kcontext,-$tu.getWeight());
end
该规则在 Optaplanner 7.48/Drools 7.48 中完美运行。
当我在我的 Optaplanner 8.3.0/Drools 7.50 项目中使用此规则时,我收到一条非常无用的消息...
java.lang.IllegalStateException: There is an error in a scoreDrl or scoreDrlFile.
at uk.me.selwyn_family.league.scheduler.solver.solverTest.testBuildSeasonSolver(SolverTest.java:47)
Caused by: java.lang.UnsupportedOperationException
at uk.me.selwyn_family.league.scheduler.solver.solverTest.testBuildSeasonSolver(SolverTest.java:47)
经过数小时的跟踪,我发现异常实际上是在 org.drools.modelcompiler.builder.generator.expressiontyper.ExpressionTyper 中的第 243 行抛出的
Expression parentLeft = findLeftLeafOfNameExpr(halfPointFreeExpr.getParentNode().orElseThrow(UnsupportedOperationException::new));
并且发生是因为 parentNode 为空。
我可以通过在 this.
前面简单地添加 matches()
来解决这个问题,如下所示...
rule "applyHomeTeamConstraints"
enabled true
when $f1: ProblemFixture(slot != null,this.matches($f1.slot.dateTime) )
then
scoreHolder.penalize(kcontext,-$tu.getWeight());
end
我正在尝试确定它是否只是在 7.48 版本中偶然工作而实际上根本不应该工作,或者是否存在应该报告的错误已潜入 Drools 7.50。
无论哪种方式,更有用的错误消息都会很好!
感谢收到任何建议。
更新:现在我告诉 Surefire 不要trimstackTrace 这里是完整的跟踪...
java.lang.IllegalStateException: There is an error in a scoreDrl or scoreDrlFile.
at org.optaplanner.core.impl.score.director.scoreDirectorFactoryFactory.buildDroolsscoreDirectorFactory(scoreDirectorFactoryFactory.java:280)
at org.optaplanner.core.impl.score.director.scoreDirectorFactoryFactory.decideMultiplescoreDirectorFactories(scoreDirectorFactoryFactory.java:103)
at org.optaplanner.core.impl.score.director.scoreDirectorFactoryFactory.buildscoreDirectorFactory(scoreDirectorFactoryFactory.java:68)
at org.optaplanner.core.impl.solver.DefaultSolverFactory.buildscoreDirectorFactory(DefaultSolverFactory.java:116)
at org.optaplanner.core.impl.solver.DefaultSolverFactory.getscoreDirectorFactory(DefaultSolverFactory.java:73)
at org.optaplanner.core.api.score.scoreManager.create(scoreManager.java:59)
at uk.me.selwyn_family.league.scheduler.solver.SeasonSolver.<init>(SeasonSolver.java:31)
at uk.me.selwyn_family.league.scheduler.solver.solverTest.testBuildSeasonSolver(SolverTest.java:47)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:696)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:882)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1189)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:124)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:348)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:343)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:305)
at org.testng.SuiteRunner.run(SuiteRunner.java:254)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
at org.testng.TestNG.run(TestNG.java:1057)
at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:136)
at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeSingleClass(TestNGDirectoryTestSuite.java:112)
at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:99)
at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:145)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:428)
at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:562)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:548)
Caused by: java.lang.UnsupportedOperationException
at java.base/java.util.Optional.orElseThrow(Optional.java:408)
at org.drools.modelcompiler.builder.generator.expressiontyper.ExpressionTyper.toTypedExpressionRec(ExpressionTyper.java:243)
at org.drools.modelcompiler.builder.generator.expressiontyper.ExpressionTyper.toTypedExpression(ExpressionTyper.java:153)
at org.drools.modelcompiler.builder.generator.drlxparse.ConstraintParser.getDrlxParseResult(ConstraintParser.java:174)
at org.drools.modelcompiler.builder.generator.drlxparse.ConstraintParser.drlxParse(ConstraintParser.java:104)
at org.drools.modelcompiler.builder.generator.visitor.pattern.PatternDSL.findAllConstraint(PatternDSL.java:139)
at org.drools.modelcompiler.builder.generator.visitor.pattern.PatternDSL.buildPattern(PatternDSL.java:241)
at org.drools.modelcompiler.builder.generator.visitor.ModelGeneratorVisitor.visit(ModelGeneratorVisitor.java:145)
at org.drools.compiler.lang.descr.PatternDescr.accept(PatternDescr.java:303)
at org.drools.modelcompiler.builder.generator.visitor.AndVisitor.visit(AndVisitor.java:50)
at org.drools.modelcompiler.builder.generator.visitor.ModelGeneratorVisitor.visit(ModelGeneratorVisitor.java:86)
at org.drools.modelcompiler.builder.generator.ModelGenerator.processRule(ModelGenerator.java:187)
at org.drools.modelcompiler.builder.generator.ModelGenerator.generateModel(ModelGenerator.java:160)
at org.drools.modelcompiler.builder.ModelBuilderImpl.compileKNowledgePackages(ModelBuilderImpl.java:284)
at org.drools.modelcompiler.builder.ModelBuilderImpl.buildrules(ModelBuilderImpl.java:220)
at org.drools.modelcompiler.builder.ModelBuilderImpl.postBuild(ModelBuilderImpl.java:130)
at org.drools.compiler.builder.impl.CompositeKNowledgeBuilderImpl.build(CompositeKNowledgeBuilderImpl.java:115)
at org.drools.compiler.builder.impl.CompositeKNowledgeBuilderImpl.build(CompositeKNowledgeBuilderImpl.java:99)
at org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKNowledgePackages(AbstractKieProject.java:268)
at org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKNowledgePackages(AbstractKieProject.java:216)
at org.drools.compiler.kie.builder.impl.AbstractKieProject.verify(AbstractKieProject.java:80)
at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildKieProject(KieBuilderImpl.java:277)
at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:245)
at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:202)
at org.kie.internal.utils.KieHelper.getKieContainer(KieHelper.java:100)
at org.kie.internal.utils.KieHelper.build(KieHelper.java:82)
at org.optaplanner.core.impl.score.director.scoreDirectorFactoryFactory.buildDroolsscoreDirectorFactory(scoreDirectorFactoryFactory.java:272)
... 36 more
(难怪找了很久!!!)
解决方法
这听起来像是 Drools 中的回归。是的,该错误消息没有帮助 - 这也是一个问题(请注意,Drools 改进了很多以获得更好的错误消息,并且编写约束的新方法 (ConstraintStreams) 具有更有用的堆栈跟踪)。
对我来说没有意义的一件事是您的堆栈跟踪:
java.lang.IllegalStateException: There is an error in a scoreDrl or scoreDrlFile.
at uk.me.selwyn_family.league.scheduler.solver.SolverTest.testBuildSeasonSolver(SolverTest.java:47)
Caused by: java.lang.UnsupportedOperationException
at uk.me.selwyn_family.league.scheduler.solver.SolverTest.testBuildSeasonSolver(SolverTest.java:47)
此堆栈跟踪未提及 org.optaplanner
或 org.drools
行。您能否也分享一下 SolverTest.java:47
的代码,以便我们验证它不会隐藏/吃掉异常?该消息似乎确实来自 OptaPlanner,但真正的 OptaPlanner 异常将具有来自 org.drools 中一行的链式(= 由)异常,希望有更多信息供我们诊断为什么它没有给出正确的错误消息.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。