在 Drools 中设置和获取全局变量

如何解决在 Drools 中设置和获取全局变量

我在drl文件中有这样的东西:

import java.lang.String

global String result;

rule ''Rule 1'' when some condition
    then 
result = "PASS";
kcontext.getKNowledgeRuntime().setGlobal("Result",result); // I got an "Unexpected global" exception.
System.out.println("result = "+ Result);

另外,我不知道如何从 MyService.java 类访问这个全局变量

解决方法

您的规则不应触及“kcontext”。你到底想做什么? result = "PASS" 足以设置全局值。

global String result

rule "Rule 1" 
when 
  // some condition
then 
  result = "PASS";
end

当然它不会像您希望的那样工作,因为您需要更改现有对象的值;你不能像那样覆盖它。某些选项可能是“ResultsHolder”类,您可以设置一个布尔变量;或者甚至是您可以调用设置的 AtomicBoolean

要使用全局触发规则,您需要在调用规则之前将全局对象添加到 KieBase:

var value = ...; // some OBJECT which you are going to pass in as a global

KieSession session = ruleBase.newStatefulSession();
session.insert(...); // insert data
session.setGlobal( "myGlobalFoo",value ); // sets the global; note the name must match the rule file!
session.fireAllRules();

触发规则后,您将获得可以使用的对 value 的引用。这也是您不能将字符串作为全局变量传递并期望它们捕获更改的原因——Java 是按值传递,而不是按引用传递。


这是一个将结果传递出规则的示例。这个玩具应用会检查学生的考试成绩,然后决定他们是通过还是失败。

课程:

class Student {
  private String name;
  public String getName() { return this.name; }
  public void setName(String name) { this.name = name; }
}

class Exam {
  private String name;
  private Double score;
  public String getName() { return this.name; }
  public void setName(String name) { this.name = name; }
  public Double getScore() { return this.score; }
  public void setScore(String score) { this.score = score; }
}

class ExamResults {
  private List<String> results = new ArrayList<>();
  public void logResults( String name,Double score,boolean passed ) {
    this.results.add(name + " scored " + score + "%,which is a " + (passed ? "passing": "failing") + " grade.");
  }
  public List<String> getResults() { return this.results; }
}

规则:

global ExamResults results;

rule "Evaluate exam"
when
  Student( $name: name )
  Exam ( $score: score,name == $name )
then
  boolean passed = $score > 60.0;
  results.logResults( $name,$score,passed );
end

调用:

List<Student> students = ...;
List<Exam> exams = ... ;
ExamResults results = new ExamResults();

KieSession session = ruleBase.newStatefulSession();
students.forEach( student -> session.insert(students) );
exams.forEach( exam -> session.insert(exam) );
session.setGlobal( "results",results);
session.fireAllRules();

// Print the results:
results.getResults().forEach(System.out::println);

如果您只是想从规则中获取一些数据(例如某些条件是否匹配),我之前已经写过关于如何做到这一点的答案here 和 {{3} }.如果您只想知道触发了哪些规则,您应该编写一个 here 来记录规则命中(“afterMatchFired”)。

,

我试图从 drl 文件中设置一个全局变量,而不是像 Service 类那样的 java 类。

我所要做的就是以下操作并且成功

导入 java.lang.String

全局字符串结果;

规则''规则1'' 当
一些条件

然后

String grade = "PASS";

kcontext.getKnowledgeRuntime().setGlobal("result",grade);  
                                                                                                                

结束

此外,全局变量名称应该与我在 setGlobal("result",...) 上传递的名称相匹配。

然后使用我在 Service 类中的会话获取全局变量。喜欢:

session.getGlobal("result");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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元字符(。)和普通点?