我必须从Java类中发送一些值,这些值调用Jess脚本以便在Jess脚本中进行处理。
这是我的代码,直到现在:
int val1=0;
int val2=1;
Rete engine = new Rete();
Value val = engine.batch("abc.clp");
System.out.println("\n"+val);
engine.watchAll();
如何传递值val1
和val2
?我找到了这个example,但它没有多大帮助。
答案 0 :(得分:1)
对话框中的一组值最好放入POJO中,该POJO插入到工作内存中,并通过声明为从Java类派生的deftemplate进行访问。在规则中使用它很简单。 POJO还可以包含用于存储规则触发所得结果的字段。
脚本应该设置Jess定义,但不应该调用run。这最好是从Java完成的,并且最好在插入事实之后完成。
以下是显示所有上述内容的最低示例。
import jess.*;
public class Main {
public static void main( String[] args ) throws Exception {
Rete rete = new Rete();
Value val = rete.batch("security.clp");
Data data = new Data();
data.setA( 42 );
data.setB( 24 );
rete.add( data );
rete.run();
System.out.println( "result = " + data.getRes() );
}
}
POJO课程:
public class Data {
private int a;
private int b;
private String res;
public void setA( int v ){ a = v; }
public void setB( int v ){ b = v; }
public void setRes( String v ){ res = v; }
public int getA(){ return a; }
public int getB(){ return b; }
public String getRes(){ return res; }
}
clp文件,(经过修改以演示如何访问插槽值,并添加了无循环):
(clear)
(deftemplate Data (declare (from-class Data)))
(defrule matchab
(declare (no-loop TRUE))
?data <- (Data {a > b} (b ?b))
=>
(printout t (fact-slot-value ?data a) " and " ?b crlf)
(modify ?data (res agtb))
)