当前位置: 首页 > 知识库问答 >
问题:

Drools无状态会话与有状态会话

漆雕唯
2023-03-14

需要一些帮助!!我对Drools中的有状态和无状态会话没有清晰的理解。我正在努力理解这一点,所以尝试了一个例子。

我在drools6.5版本上使用有状态和无状态会话测试了下面的drl,在这两种情况下都得到了相同的输出。根据我对无状态会话的理解,它应该只执行第一条规则,当应用程序对象在第一条规则中被修改时,第二条规则不应该被激活(“有效期”)。附加源代码。感谢您在这方面的帮助。

package com.company.license

import com.sample.dto.Applicant;
import com.sample.dto.Application;
import java.util.Date;


rule "Is of valid age"
no-loop
    when 
        Applicant( age < 18 )
        $a : Application()
    then
        $a.setValid( false );
        modify($a){setDateApplied(new Date())};
        System.out.println("from rule Is of Valid age --  " +$a.isValid() );
    end

rule "Application was made this year"
    when 
        $a : Application( dateApplied > "01-jan-2009" )
    then 
    $a.setValid( true);
    System.out.println("from rule made this year --  " +$a.isValid() );
end


package com.sample.dto;

import java.util.Date;

public class Application {
    public Date dateApplied;
    public boolean valid;

    // getter and setter methods here
    public Date getDateApplied() {
        return dateApplied;
    }
    public void setDateApplied(Date dateApplied) {
        this.dateApplied = dateApplied;
    }
    public boolean isValid() {
        return valid;
    }
    public void setValid(boolean valid) {
        this.valid = valid;
    }
}


package com.sample.dto;
public class Applicant {
    public String name;
    public int age;

    public Applicant(String name,int age){
        this.name =  name;
        this.age=age;
    }


    public String getName() {
        return name;
    }


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


    public int getAge() {
        return age;
    }


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

package com.sample;

import java.util.Arrays;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.StatelessKieSession;

import com.sample.dto.Applicant;
import com.sample.dto.Application;

/**
 * This is a sample class to launch a rule.
 */
public class LicenseTestStateful {

    public static final void main(String[] args) {
        try {
            // load up the knowledge base
            KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            KieSession ksession = kContainer.newKieSession("ksession-rules");
            Applicant applicant = new Applicant( "Mr John Smith", 16);
            Application application = new Application();
            ksession.execute(ks.getCommands().newInsertElements(Arrays.asList(new Object[]{application,applicant})));
            ksession.fireAllRules();
            ksession.dispose();

        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}


package com.sample;

import java.util.Arrays;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.StatelessKieSession;

import com.sample.dto.Applicant;
import com.sample.dto.Application;

/**
 * This is a sample class to launch a rule.
 */
public class LicenseTestStateless {

    public static final void main(String[] args) {
        try {
            // load up the knowledge base
            KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            StatelessKieSession ksession = kContainer.newStatelessKieSession();
            Applicant applicant = new Applicant( "Mr John Smith", 16);
            Application application = new Application();
            ksession.execute(ks.getCommands().newInsertElements(Arrays.asList(new Object[]{application,applicant})));       
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="rules" packages="rules">
        <ksession name="ksession-rules"/>
        <ksession name="statelesssession" type="stateless" default="true"/>
    </kbase>
    <kbase name="dtables" packages="dtables">
        <ksession name="ksession-dtables"/>
    </kbase>
    <kbase name="process" packages="process">
        <ksession name="ksession-process"/>
    </kbase>
</kmodule>


Output:
from rule Is of Valid age --  false
from rule made this year --  true

共有2个答案

柴文林
2023-03-14

我想我是对的。如果事实的更改发生在同一个请求中,那么与该更改相关的所有其他规则都将触发,而不考虑任何无状态/有状态会话。

凌蕴藉
2023-03-14

无状态和有状态KieSession之间的区别在于使用会话的API。使用一种方法激活无状态会话,其中将一组命令传递给要执行的会话,并在结束时调用dispose以返回所有资源;因此,会话无法重复使用,其状态将丢失。

使用全状态会话,您可以选择以您喜欢的任何顺序执行各种API调用,根据需要经常调用一些“fire”方法等。

无状态KieSession只是KieSession的包装器。

 类似资料:
  • 我对口水还不熟悉。我试图理解Drools提供的无状态会话和有状态会话之间的区别。 根据我的初步理解, 在无状态会话的情况下,如果在任何规则的操作执行过程中修改了事实,则不会将其重新提交给推理引擎以找出与修改后的事实匹配的新规则。 在状态会话的情况下,如果在任何规则的操作执行过程中修改了事实,则它将被重新提交给推理引擎以找出与修改后的事实相匹配的新规则,然后执行相应的操作。 因此,当我试图通过编写一

  • Drools中无状态会话和有状态会话的区别是什么。我浏览了不同的文件,发现下面 无状态会话执行规则时事实的任何更改都不会被规则引擎察觉,因此如果任何规则被修改,则不会发生其他规则的重新激活。 我试图执行下面的规则,发现了相同的结果

  • 我是EJB的新手,最近开始研究EJB(3.0)。我已经使用Java6年了,但以前从未使用过EJB。至少可以说,整个EJB业务的复杂性让我不知所措。我不明白我可以在哪里实际应用一些概念。 在理解无状态会话bean后,我想到的一个问题是,你能不能不要总是用一个没有本地成员的类的共享实例来替换无状态会话bean(实际上使其无状态)?我了解到正在为无状态会话bean进行实例池。如果没有状态,就不能简单地使

  • 对于有状态会话bean(SFSB)和无状态会话bean(SLSB)的用法,我有点困惑。 我知道SFSB与客户保持状态。这很有帮助:什么时候使用有状态会话bean而不是无状态会话bean? 这里和许多其他地方提供的示例是SFSB的购物车。 “如果一个任务需要一系列方法调用(不止一次),并且您需要保留以前的结果以在下一次调用中使用它们,那么就可以使用SFSB”--Source。这将更像是签出(页面之间

  • 我们正在尝试使用Drool作为我们的规则引擎服务。我们到目前为止所做的如下 部署的工作台7.2.final 已部署的KIE服务器7.2.0。final 配置了一些数据对象、规则,将更改部署到KIE服务器,我们可以使用rest API执行规则 无状态会话满足了我们的大部分需求(给出一组数据,执行规则并返回数据,仅此而已)。但是使用无状态时,我们必须牺牲Drools有状态会话提供的许多重要特性。 我们

  • 问题内容: 有状态会话Bean定义如下: 有状态会话Bean对象的状态由其实例变量的值组成。在有状态会话Bean中,实例变量代表唯一的客户端Bean会话的状态。因为客户端与其bean进行交互(“交谈”),所以这种状态通常称为对话状态。 无状态会话Bean定义如下: 无状态会话Bean无状态会话Bean不会与客户端保持对话状态。当客户端调用无状态Bean的方法时,该Bean的实例变量可能包含特定于该