05 常用规则组件
1、Global
会话与外部环境之间的通讯的纽带。通过 Global,既可以向会话中传递信息,也可以从会话中接收信息。
测试类
传递一个Boolean,Student,通过全局变量isEnable决定是否启动规则,通过规则修改Student的name;
规则
结果
2、Channel
可以从会话内部向外部环境传递信息
KieSession 提供了方法注册和注销 Channel:
- void registerChannel(String name, Channel channel)
- void unregisterChannel(String name)
规则
调用
结果
3、Query
1:按需查询
特定时间点执行特定的查询时,就会使用按需查询
2:实时查询
将侦听器附加到查询中,以便在它们可用时
第一个参数是我们想要附加一个侦听器的Query的名称,第二个参数是查询所期望接收的参数数组。第三个参数是我们想要连接到查询的实际侦听器
两个整合代码如下:
测试类
规则
4、exists
exists 用于判断符合条件的 fact 是否存在
示例:
rule "test exists"
when
exists(StudentFact(sex == "female", age > 18))
then
System.out.println("存在女学生已经成年");
end
rule "test"
when
StudentFact(sex == "female", age > 18)
then
System.out.println("女学生已经成年");
end
当向会话中插入多个 StudentFact(sex = "female", age > 18) fact 时,前者仅执行一次,而后者 会执行多次。
如下:
5、forall
forall 用于判断是否所有的 fact 都满足条件。
例子,只有当所有的学校的班级数都大于120才满足条件,代码如下:
6、Collect
collect 用于将所有匹配的元素放入一个数据集中。
例子如下:注意如何在规则中对集合进行操作;
返回结果