簡體   English   中英

無狀態與流氓中的有狀態會話行為

[英]Stateless Vs Stateful Session behavior in drools

我是流口水的新手。 我試圖理解Drools提供的無狀態和有狀態會話之間的區別。

根據我最初的理解,

在無狀態會話的情況下,如果在任何規則的動作執行期間修改了事實,則不會將其重新提交給推理引擎以找出與修改的事實匹配的新規則。

在有狀態會話的情況下,如果在任何規則的動作執行期間修改了事實,則將其重新提交給推理引擎以找出與修改的事實匹配的新規則,然后將執行它們的相應動作。

因此,當我嘗試通過編寫示例規則來驗證此行為時,我發現兩種情況下的行為完全相同。 所以現在我對有狀態會話和無狀態會話之間的區別感到困惑。

我想請大家幫助我理解有狀態和無狀態會話的正確行為。

為了您的參考,我將粘貼有狀態和無狀態會話的示例代碼及其輸出和示例規則。

licenseApplication.drl   (Rule file)

package com.idal.droolsapp

rule "Is of valid age"
    no-loop
when
    $a : Applicant( age < 18 )
then
    System.out.println( "Not eligible for license" );
    System.out.println( "Setting Valid to false" );
    modify( $a ) { setValid( false ) };
end

rule "Is of valid false"
    salience 100
when
    $a : Applicant( valid == false )
then
    System.out.println( "Second rule fired" );
end

輸入對象(Fact)Applicant.java

package com.idal.droolsapp;

public class Applicant {

    private String name;

    private int age;

    private boolean valid = true;

    public Applicant(String name, int age) {
        setName(name);
        setAge(age);
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setValid(boolean valid) {
        this.valid = valid;
    }

    public boolean isValid() {
        return valid;
    }

    @Override
    public String toString() {
        return "Applicant [name=" + name + ", age=" + age + ", valid=" + valid
                + "]";
    }


}

StatelessSessionExample.java(無狀態會話測試代碼)

package com.idal.droolsapp;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatelessKnowledgeSession;

public class StatelessSessionExample {

    /**
     * @param args
     */
    public static void main(String[] args) {

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
                .newKnowledgeBuilder();

        kbuilder.add(ResourceFactory.newClassPathResource(
                "licenseApplication.drl", StatelessSessionExample.class),

        ResourceType.DRL);

        if (kbuilder.hasErrors()) {

            System.err.println(kbuilder.getErrors().toString());

        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();

        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

        StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();

        Applicant applicant = new Applicant( "Mr John Smith", 16 );

        ksession.execute( applicant );

        System.out.println("Updated Applicant = " + applicant);
    }

}

無狀態會話測試代碼的輸出:

 Not eligible for license Setting Valid to false Second rule fired Updated Applicant = Applicant [name=Mr John Smith, age=16, valid=false] 

StatefulSessionExample.java(無狀態會話測試代碼)

package com.idal.droolsapp;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;

public class StatefulSessionExample {

    /**
     * @param args
     */
    public static void main(String[] args) {

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
                .newKnowledgeBuilder();

        kbuilder.add(ResourceFactory.newClassPathResource(
                "licenseApplication.drl", StatefulSessionExample.class),

        ResourceType.DRL);

        if (kbuilder.hasErrors()) {

            System.err.println(kbuilder.getErrors().toString());

        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();

        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();

        Applicant applicant = new Applicant( "Mr John Smith", 16 );

        ksession.insert( applicant );

        ksession.fireAllRules();

        ksession.dispose();

        System.out.println("Updated Applicant = " + applicant);
    }

}

有狀態會話測試代碼的輸出:

 Not eligible for license Setting Valid to false Second rule fired Updated Applicant = Applicant [name=Mr John Smith, age=16, valid=false] 

再次要求每個人幫助我理解有狀態和無狀態會話的正確行為。

在此先感謝Manish Gandhi

據我所知,當您在無狀態會話中觸發規則時,更改不會觸發新規則。 但這並不意味着規則不會因為變化而被解雇。 第一個規則更改有效值,這意味着當您檢查第二個規則的條件時,有效已經為假並且規則觸發。

如果更改影響了先前規則的“何時”部分,則在無狀態會話中,第一個規則將不會被第二次觸發,而第一個規則將在第一個規則中觸發。

暫無
暫無

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

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