我是流口水的新手 . 我正在使用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 + "]";
}

}

任何建议将不胜感激 .