关于drools有状态会话和无状态会话到底有何区别的看法

关于有状态会话和无状态的会话的区别,很多人不能真正理解,小哥也不是很理解,但也有些看法,以下是官网翻译而来

一、有状态会话常见用例:

1. 监测 

半自动买入股票市场监控与分析。 
2. 诊断 
故障查找,医疗诊断 
3. 物流 
包裹跟踪和送货配置 
4. 合规 

验证市场交易的合法性。

使用推理

举例:

rule "When there is a fire turn on the sprinkler"

when Fire($room : room)  

$sprinkler : Sprinkler( room == $room, on == false )

then  

modify( $sprinkler ) { setOn( true ) };  

System.out.println( "Turn on the sprinkler for room " + $room.getName() );

end

rule "When the fire is gone turn off the sprinkler"

when $room : Room( )  

$sprinkler : Sprinkler( room == $room, on == true )  

not Fire( room == $room )

then  

modify( $sprinkler ) { setOn( false ) };  

System.out.println( "Turn off the sprinkler for room " + $room.getName() );

end


二、无状态会话常见用例:

  1. 验证 
    这个人有资格获得抵押吗?
  2. 计算 
    计算抵押保费。
  3. 路由和过滤 
    将传入的邮件(如电子邮件)过滤到文件夹中。 
    将传入的邮件发送到目的地。

无状态会话,不使用推理,形成最简单的用例。

举例:

package com.company.license

rule "Is of valid age"

when  

$a : Applicant( age < 18 )

then  

$a.setValid( false );end


根据官网意思,有状态和无状态会话的一个重要区别是,无状态会话不使用推理,是一种最简单的使用方式,

那么到底怎么理解这个“推理”,这里说一下小哥的理解,举个例子来说明:有两个规则,规则一里面可以修改age,

规则二的条件是age>18,那么,插入一个age为10的对象,当你在规则一中用modify把age设置为24时,规则

引擎会意识到这个值变了,会触发规则二的执行,这就是推理

代码如下:

规则:

rule "test_1"
     when
        $p:Person(age==15)
     then
        modify($p){setAge(24)}
        System.out.println("-hello--");
 end

 rule "test_2"
     when
        $p:Person(age>20)
     then
        System.out.println("-hello2--");
 end
juit测试:
@Test
public void test4() throws Exception {
   Person p1 = new Person("001", "z3", 15);
   FactHandle handle = kieSession.insert(p1);
   kieSession.fireAllRules();
   kieSession.delete(handle);
   kieSession.dispose();
}
执行结果:
-hello--
-hello2--


那么,小哥最后总结,在实际开发中,如果规则的when中只涉及到一种对象,不需要推理,

也不关注曾经插入drools的历史数据,就用无状态会话,否则用有状态会话,哪里不理解可以加群讨论

你可能感兴趣的:(drools)