簡體   English   中英

Drools-WorkBench 中的泛型類

[英]Generic classes within Drools-WorkBench

我目前正在開展一個項目,該項目要求輸入 Drools-Workbench 進行驗證,是通用的。

所以本質上應該發生的是以下情況;

  1. 從 RabbitMQ 通道接收 object。
  2. 使用 Drools-WB 驗證 object。
  3. 將驗證結果(從 Drools-WB 獲得)上傳到 RabbitMQ 通道。

我有以下ruleSet ,其中input是“通用部分”,並且規則集應指定應從 Drools-WB 實例中使用哪個規則表。

public class InputObject {


    private Integer primaryKey;

    private Integer sessionId;

    private Integer transactionId;

    private String ruleSet;

    private Map<String, Object> input;

    private List<ValidationResult> validationResults;
    public void addValidationResult(ValidationResult validationResult) {
        this.validationResults.add(validationResult);
    }
    // [...]
}

這是使用KieServicesClient for JAVA 提交到我的 Drools-WB 實例,使用以下命令:

KieCommands commandFactory = kieServices.getCommands();
commands.add(commandFactory.newInsert(inputObject, "ValRes"));
commands.add(commandFactory.newFireAllRules());

BatchExecutionCommand batchExecutionCommand = commandFactory.newBatchExecution(commands, conf.getKieSession());

ServiceResponse<ExecutionResults> response = this.createRulesClient()
        .executeCommandsWithResults(inputObject.getRuleSet(), batchExecutionCommand);
ExecutionResults singleRes = response.getResult();

規則在.xlsx 文件中指定,因此“非技術”人員應該可以“更輕松”地提交規則。 目前適用以下規則; 具有一個規則和一個條件的 xlsx 工作表 盡管使用此配置,始終會拋出 null 異常,但無論我如何將值分配給input變量。

除此之外,我試圖簡單地從 LinkedHashMap 繼承一個新的 object,就像這樣;

public class DroolsObject extends LinkedHashMap<String, Object> {


    public void addValidationResult(ValidationResult validationResult) {
        if (!this.containsKey("validationResult"))
            this.put("validationResult", new LinkedList<ValidationResult>());
        ((List<ValidationResult>) this.get("validationResult")).add(validationResult);
    }
}

其中input只是這個DroolsObject class 的一個實例。 使用此配置,可以在 Drools.xlsx 表中使用關鍵字this ,如下所示; 一個簡單的規則集,就像以前一樣,只使用關鍵字“this”

但是使用這種配置,規則只是被執行,無論 DyrAlder 的值如何,規則都不會被觸發。

我知道 function addValidationResult在這種情況下有效,因為當我創建一個 class 時,我設法收到了結果,其中測試的變量是 pr。 默認。

所以我的問題是這樣的; 我還沒有真正找到任何與概括 Drools class 相關的東西,所以如果我是 SOL 使用這種方法,或者如果有另一種方法可以做到這一點,我希望能得到一些答案? 也許有一個我要發送到 Drools-WB 的 HashMap,然后只覆蓋 class,以便它可以使用存儲庫中指定的特定 class。

無論如何,節日快樂,並提前感謝您抽出寶貴時間回答這個問題!

只有當我在沒有正確初始化的情況下插入對象時,我才能為第一個示例重現 NullPointerException。 對於第二種情況,確實this["DyrAlder"] < $param不起作用,但是this.get("DyrAlder") < $paramthis.DyrAlder < $param甚至DyrAlder < $param適合我。

根據您的描述,我使用所需的ruleSet參數將您的規則復雜化,以獲得滿足您要求的工作 POC。 在插入的 10 個對象中,只有 5 個符合條件DyrAlder < 5 ,只有 1 個符合ruseSet == "set3" ,因此您只觸發了一次規則。

測試 1(輸入對象)

@DroolsSession(resources = "draft/inputObjectExample.xlsx",
        builderProperties = "drools.dump.dir = target/dump",
        showStateTransitionPopup = true)
public class PlaygroundTest extends DroolsAssert {
    
    @RegisterExtension
    public DroolsAssert droolsAssert = this;
    
    @Test
    @TestRules(expectedCount = { "1", "Check_DyrAlder" })
    public void testInputObjectExample() {
        KieCommands commandFactory = KieServices.get().getCommands();
        List<Command<?>> commands = new ArrayList<>();
        
        for (int i = 0; i < 10; i++) {
            InputObject inputObject = new InputObject();
            inputObject.setTransactionId(i);
            inputObject.setRuleSet("set" + i);
            inputObject.setInput(ImmutableMap.of("DyrAlder", i));
            inputObject.setValidationResults(new ArrayList<>());
            
            commands.add(commandFactory.newInsert(inputObject, "ValRes"));
            commands.add(commandFactory.newFireAllRules());
        }
        
        commands.forEach(c -> getSession().execute(c));
    }
}

決策表

在此處輸入圖像描述

生成的規則

package draft;
//generated from Decision Table
import draft.InputObject;
import draft.ValidationResult;
// rule values at A9, header at A4
rule "Check_DyrAlder"
    when
        animal:InputObject(ruleSet == "set3", input["DyrAlder"] < 5)
    then
        animal.addValidationResult(new ValidationResult("HDY-08277", "message"));
end

Model

public class InputObject {
    private Integer primaryKey;
    private Integer sessionId;
    private Integer transactionId;
    private String ruleSet;
    private Map<String, Object> input;
    private List<ValidationResult> validationResults;
    // getters/setters

測試 2 (DroolsObject)

@DroolsSession(resources = "draft/droolsObjectExample.xlsx",
        builderProperties = "drools.dump.dir = target/dump",
        showStateTransitionPopup = true)
public class PlaygroundTest extends DroolsAssert {
    
    @RegisterExtension
    public DroolsAssert droolsAssert = this;
    
    @Test
    @TestRules(expectedCount = { "1", "Check_DyrAlder" })
    public void testDroolsObjectExample() {
        KieCommands commandFactory = KieServices.get().getCommands();
        List<Command<?>> commands = new ArrayList<>();
        
        for (int i = 0; i < 10; i++) {
            DroolsObject inputObject = new DroolsObject();
            inputObject.put("ruleSet", "set" + i);
            inputObject.put("DyrAlder", i);
            
            commands.add(commandFactory.newInsert(inputObject, "ValRes"));
            commands.add(commandFactory.newFireAllRules());
        }
        
        commands.forEach(c -> getSession().execute(c));
    }
}

決策表

在此處輸入圖像描述

生成的規則

package draft;
//generated from Decision Table
import draft.DroolsObject;
import draft.ValidationResult;
// rule values at A9, header at A4
rule "Check_DyrAlder"
    when
        animal:DroolsObject(ruleSet == "set3", DyrAlder < 5)
    then
        animal.addValidationResult(new ValidationResult("HDY-08277", "message"));
end

Model

public class DroolsObject extends LinkedHashMap<String, Object> {
    public void addValidationResult(ValidationResult validationResult) {
        if (!this.containsKey("validationResult"))
            this.put("validationResult", new LinkedList<ValidationResult>());
        ((List<ValidationResult>) this.get("validationResult")).add(validationResult);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM