从 org.drools.modelcompiler.builder.generator.expressiontyper.ExpressionTyper

如何解决从 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.optaplannerorg.drools 行。您能否也分享一下 SolverTest.java:47 的代码,以便我们验证它不会隐藏/吃掉异常?该消息似乎确实来自 OptaPlanner,但真正的 OptaPlanner 异常将具有来自 org.drools 中一行的链式(= 由)异常,希望有更多信息供我们诊断为什么它没有给出正确的错误消息.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?