85.7. 决定引擎中的会话时钟实现
在复杂的事件处理过程中,决策引擎中的事件可能会具有临时限制,因此需要会话时钟可提供当前时间。例如,如果某个规则需要确定给定库存在最后 60 分钟的平均价格,则决策引擎必须能够将库存价格事件时间戳与会话时钟中的当前时间进行比较。
决策引擎支持实时时钟和伪时钟。根据具体情况,您可以使用一个或多个时钟类型:
- 规则测试: 测试需要一个受控的环境,当测试包含具有临时限制的规则时,您必须能够控制输入规则和事实以及时间流。
- 定期执行: 决策引擎实时响应事件,因此需要实时时钟。
- 特殊环境: 特定环境可能具有特定时间控制要求。例如,集群环境可能需要时钟同步或 Java Enterprise Edition(JEE)环境,可能需要由应用服务器提供的时钟。
- 规则重播或模拟: 若要重播或模拟,应用必须能够控制时间流。
当您决定在决策引擎中使用实时时钟还是伪时钟时,请考虑您的环境要求。
- 实时时钟
实时时钟是决策引擎中的默认时钟实施,使用系统时钟确定时间戳的当前时间。要将决策引擎配置为使用实时时钟,请将 KIE 会话配置参数设置为
realtime
:在 KIE 会话中配置实时时钟
import org.kie.api.KieServices.Factory; import org.kie.api.runtime.conf.ClockTypeOption; import org.kie.api.runtime.KieSessionConfiguration; KieSessionConfiguration config = KieServices.Factory.get().newKieSessionConfiguration(); config.setOption(ClockTypeOption.get("realtime"));
- 伪时钟
决策引擎中的伪时钟实施有助于测试临时规则,并由应用程序控制。要将决策引擎配置为使用伪时钟,请将 KIE 会话配置参数设置为
伪
:在 KIE 会话中配置伪时钟
import org.kie.api.runtime.conf.ClockTypeOption; import org.kie.api.runtime.KieSessionConfiguration; import org.kie.api.KieServices.Factory; KieSessionConfiguration config = KieServices.Factory.get().newKieSessionConfiguration(); config.setOption(ClockTypeOption.get("pseudo"));
您还可以使用额外的配置和事实处理程序来控制伪时钟:
在 KIE 会话中控制伪时钟行为
import java.util.concurrent.TimeUnit; import org.kie.api.runtime.KieSessionConfiguration; import org.kie.api.KieServices.Factory; import org.kie.api.runtime.KieSession; import org.drools.core.time.SessionPseudoClock; import org.kie.api.runtime.rule.FactHandle; import org.kie.api.runtime.conf.ClockTypeOption; KieSessionConfiguration conf = KieServices.Factory.get().newKieSessionConfiguration(); conf.setOption( ClockTypeOption.get("pseudo")); KieSession session = kbase.newKieSession(conf, null); SessionPseudoClock clock = session.getSessionClock(); // While inserting facts, advance the clock as necessary. FactHandle handle1 = session.insert(tick1); clock.advanceTime(10, TimeUnit.SECONDS); FactHandle handle2 = session.insert(tick2); clock.advanceTime(30, TimeUnit.SECONDS); FactHandle handle3 = session.insert(tick3);