关于有状态会话和无状态的会话的区别,很多人不能真正理解,小哥也不是很理解,但也有些看法,以下是官网翻译而来
一、有状态会话常见用例:
1. 监测
半自动买入股票市场监控与分析。验证市场交易的合法性。
使用推理
举例:
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
二、无状态会话常见用例:
无状态会话,不使用推理,形成最简单的用例。
举例:
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--
那么,小哥最后总结,在实际开发中,如果规则的when中只涉及到一种对象,不需要推理,
也不关注曾经插入drools的历史数据,就用无状态会话,否则用有状态会话,哪里不理解可以加群讨论