我是流口水的新手 . 我正在使用kieFileSystem.write上传DRL文件,首先我试图从我的src / main / resources位置加载它,它运行正常 . 但我的要求是从绝对位置加载DRL文件,如“C:\ properties \ dev \ conf \ AccountRules.drl”,即在我的项目的一边,它不工作,它根本没有执行任何规则,我的代码片段如下面所述:
主文件是:
public static void main(String [] args){
String[] rules = { "AccountRules.drl" };
Object[] facts = { new AccountDetails("800222222", true) };
System.out.println(facts[0]);
try {
runRules(rules, facts);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(facts[0]);
}
//规则方法:
public void runRules(String [] rules,Object [] facts){
KieServices kieServices = KieServices.Factory.get();
KieResources kieResources = kieServices.getResources();
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
KieRepository kieRepository = kieServices.getRepository();
for (String ruleFile : rules) {
Resource resource = kieResources.newFileSystemResource(new File(HOME_LOCATION + File.separator , ruleFile)).setResourceType(ResourceType.DRL);
System.out.println(HOME_DIR + File.separator + ruleFile);
// path has to start with src/main/resources
// append it with the package from the rule
kieFileSystem.write(HOME_DIR + File.separator + 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());
KieSession kSession = kContainer.newKieSession();
for (Object fact : facts) {
kSession.insert(fact);
}
kSession.fireAllRules();
}
DRL文件:
import com.test.AccountDetails;
方言“mvel”
/ * *此规则检查它是否属于组1 * /规则"Phone Number starts with"当$ p:AccountDetails(phNo.startsWith("800")|| phNo.startsWith("866")|| phNo.startsWith("1800")|| phNo.startsWith( "1866"))
然后是System.out.println("in Phone Number starts with"); $ p.status = false;结束
规则"Phone Number contains pattern"当$ p:AccountDetails(phNo.contains("111111")|| phNo.contains("222222")|| phNo.contains("333333")|| phNo.contains("444444")|| phNo.contains("555555")|| phNo . 包含("666666")|| phNo.contains("777777")|| phNo.contains("888888")|| phNo.contains("999999")|| phNo.contains("000000"))
然后是System.out.println("in Phone Number contains pattern"); $ p.status = false;
结束
AccountDetails.java:
包com.test;
public class AccountDetails {private String phNo;
private boolean status;
public AccountDetails(String phNo,boolean status) {
this.phNo = phNo;
this.status = status;
}
public String getPhNo() {
return phNo;
}
public void setPhNo(String phNo) {
this.phNo = phNo;
}
public boolean getStatus() {
return this.status;
}
public void setStatus(boolean status) {
this.status = status;
}
@Override
public String toString() {
return "PhoneNumberDetails [phNo=" + phNo + ", status=" + status + "]";
}
}
任何建议将不胜感激 .