如何在DROOLS中从一个规则访问另一个规则的arraylist
这是作为规则引擎的java文件 RuleRunner.java如何在DROOLS中从一个规则访问另一个规则的arraylist,drools,Drools,这是作为规则引擎的java文件 RuleRunner.java public class RuleRunner { KieSession kSession = null; public RuleRunner() { } /** * Method that executes all the rules specified in rule file * * @param rules * @param facts */ public void runRules(String[] rul
public class RuleRunner {
KieSession kSession = null;
public RuleRunner() {
}
/**
* Method that executes all the rules specified in rule file
*
* @param rules
* @param facts
*/
public void runRules(String[] rules, String[] values) {
KieServices kieServices = KieServices.Factory.get();
KieResources kieResources = kieServices.getResources();
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
KieRepository kieRepository = kieServices.getRepository();
for (String ruleFile : rules) {
Resource resource = kieResources.newClassPathResource(ruleFile);
kieFileSystem.write(
"src/main/resources/com/skills421/examples/drools6_0/"
+ ruleFile, resource);
}
KieBuilder kb = kieServices.newKieBuilder(kieFileSystem);
kb.buildAll();
if (kb.getResults().hasMessages(Level.ERROR)) {
throw new RuntimeException("Build Errors:\n"
+ kb.getResults().toString());
}
KieContainer kContainer = kieServices.newKieContainer(kieRepository
.getDefaultReleaseId());
kSession = kContainer.newKieSession();
for (String value : values){
kSession.insert(value);
}
kSession.fireAllRules();
}
}
这是Main.java,它集成了drl文件和规则引擎
public class Main
{
public static void main(String[] args)
{
long startTime = System.currentTimeMillis();
//Creating the rule and specifying the rule file
RuleRunner runner = new RuleRunner();
String[] rules = { "test1.drl"};
String[] values={"creditcard","personal_status","male single"};
//Object[] facts = { new CreditCard("male single",25,">=7")};
runner.runRules(rules,values);
long endTime = System.currentTimeMillis();
System.out.println("Took "+(endTime - startTime) + " ms");
}
}
我不太会流口水。这是我的.drl文件
dialect "mvel"
/*
*This rule picks people with good credit record and an employment history
of more than 7 years
*/
rule "Credit Card employment and class check"
when
passList : ArrayList()
$creditCard : CreditCard() from passList
eval($creditCard.get_class() == "good" && $creditCard.getEmployment() ==
">=7")
then
passList = new ArrayList();
passList.add($creditCard);
end
dialect "java"
rule "passList check"
when
eval( true )
then
System.out.println("passList size2....");
end
我想将passList的计算值从规则1传递到规则2。如有任何帮助,将不胜感激。这与Drools的使用方式相去甚远。请不要发布代码-描述您的Java类和问题,即。,如果检查成功或失败,应该检查和执行哪些操作。感谢您的回复。我的规则运行程序基本上会向数据存储触发一个规则,并以arraylist的形式检索记录。我们检查列表中的一个条件,以确定类是否良好,雇用期是否超过7年。我们只添加与第二个arraylist匹配的对象。我想检查另一个规则中新计算的arraylist。我正在寻找将arraylist传递给第二个规则的方法。是否可以在第一个规则中为arraylist声明一个局部变量,然后将其发送给第二个规则?这根本不起作用。插入三个字符串对象creditcard、personal_status、male single,但您的规则引用了包含creditcard对象的ArrayList。-不能将新值分配给绑定变量,因为它位于第一个规则密码列表中。无法将变量从一个规则传递到下一个规则。全局变量或insert是否有助于通过规则访问ArrayList