drools_06_stateless_vs_stateful
06_stateless_vs_stateful
stateless session
- 適用場景: 適合一次啟動規則引擎完成全量fact的計算, 它不支持增量計算.
- execution() 方法通常傳入一個對象清單, 要計算的全量入參數據, drools將這些對象推入工作內存, 然后執行規則, 最后會自動清空工作內存. Java 端可以通過execution()入參獲取的規則計算的結果.
stateful session
- 適合場景: 不斷有新增變化的fact, 需要進行規則計算的情況. 在兩次fire方法調用之間, 可以將新增的fact加入工作內存, drools 只會對新增fact做規則計算, 但如果新規則計算影響到已有的其他fact, 老的fact也會被重新計算.
- insert() 方法一次只能增加一個fact.
- stateful session最后需要顯式調用 dispose() 方法, 主動清空工作內存對于fact對象的引用, 否則會有內存泄漏問題.
- 計算結果的獲取可以通過 getObjects() 得到, 代碼片段一般是:
Collection<Order> orderList=(Collection<Order>)kieSession.getObjects();
- 連續兩次調用fire()并不會再次觸發計算, 只有在中間調用了 kieSesion.insert()/update/delete(), 再次調用fire()才會觸發規則.
//在二次調用fire()之前, 僅僅修改了對象, 不會觸發規則
Order order=new Order() ;
order.setAmount(100);
kieSession.insert(order) ;
kieSession.fireAllRules() ;
order.setAmount(200); //僅僅修改了對象, 工作內存并沒有被更新到
kieSession.fireAllRules() ; //不會觸發規則
//在二次調用fire()之前, 顯式修改fact對象, 可重新觸發規則
Order order=new Order() ;
order.setAmount(100);
FactHandle factHandle=kieSession.insert(order1) ;
kieSession.fireAllRules() ;
order.setAmount(200);
kieSession.update(factHandle,order) ; //顯式地修改fact對象
kieSession.fireAllRules() ; // 可重新觸發規則

浙公網安備 33010602011771號