factInfo) {
TestIn input = factInfo.getInput();
System.out.println("入参对象的名称:"+input.getName());
}
});
// 开始通过调度器执行
// 方式1:通过唯一标识符进行调用
ruleServiceScheduler.execute("test1", new TestIn());
ruleServiceScheduler.execute("test2", new Person());
// 方式2:直接通过入参对象进行调用(注意⚠️:此方式需要确保唯一标识符和入参对象类型是一一对应的)
TestIn in = new TestIn();
in.setName("test");
ruleServiceScheduler.execute(in);
Person person = new Person();
person.setAge(18);
ruleServiceScheduler.execute("test2", person);
}
/**
* 动态流程
*
* 1.构建规则服务调度器,并配置好RuleServiceConstructor;
* 2.通过调度器执行规则。
*
*/
@Test
public void automationProcessing(){
// 构建规则服务调度器
RuleServiceScheduler scheduler = new RuleServiceScheduler(new RuleServiceConstructor() {
/**
* 此处如何生产规则服务的方式可自由实现,例如从数据库中获取。
* @param identifier
* @return
*/
@Override
public RuleService getRuleService(String identifier) {
if ("test1".equals(identifier)){
return getTest1();
}
if ("test2".equals(identifier)){
return getTest2();
}
return null;
}
});
// 不需要添加规则服务,直接执行即可
scheduler.execute("test1",new TestIn());
/**
* 以下方式调度需要配置 {@link cn.ahaoweb.drule.core.RuleServiceConstructor#getIdentifier}
*/
// scheduler.execute(new TestIn());
}
```
#### 3.4.AfterCreateSessionCallback
`AfterCreateSessionCallback` 接口作用是在规则会话创建后提供一个扩展点,允许开发者在会话创建后执行自定义的逻辑。例如,可以在这里添加日志记录、会话参数设置、会话监听器等。
使用方式如下:
```java
RuleService test2 = new DruleServiceHelper()
// 唯一标识
.identifier("test2")
// 省略其他不相关内容...
// 设置 规则会话创建后回调函数
.afterCreateSessionCallback(ruleSession -> {
log.info("执行 afterCreateSessionCallback");
ruleSession.addPreExecuteHandler(new PreExecuteHandler() {
@Override
public void preHandler(FactInfo factInfo) {
log.info("afterCreateSessionCallback 添加的 执行前处理器:{}",factInfo);
}
});
return ruleSession;
});
```
## 📝 配置说明
### 1.规则条件运算符
```java
public enum ConditionOperate{
eq("==","等于", new Operator.Eq()),
neq("!=","不等于", new Operator.Neq()),
lt("<","小于", new Operator.Lt()),
lte("<=","小于等于", new Operator.Lte()),
gt(">","大于", new Operator.Gt()),
gte(">=","大于等于", new Operator.Gte()),
left_contains("contains","包含(左)", new Operator.LeftContains()),
right_contains("contains","包含(右)", new Operator.RightContains()),
not_left_contains("not contains","不包含(左)", new Operator.LeftNotContains()),
not_right_contains("not contains","不包含(右)", new Operator.RightNotContains()),
in("in","存在于", new Operator.In()),
not_in("not in","不存在于", new Operator.NotIn()),
matches("matches","正则匹配", new Operator.Matches()),
not_matches("not matches","正则不匹配", new Operator.NotMatches()),
// 其他条件判断符待扩充
;
}
```
#### 1.1.eq、neq
等价于java中的`equals()`和`!equals()`。
#### 1.2.lt、lte、gt、gte
关系运算`<`、`<=`、 `>`、 `>=`。
#### 1.3.left_contains、right_contains
包含(左)表示参数字段在左侧,比如 `name contains "jack"`。而包含(右)则表示参数字段在右侧,即 `"jack" contains name`。
当前条件支持List和字符串。字符串等价于`java.lang.String#contains`,List表示是否包含指定元素。
#### 1.4.not_left_contains、not_right_contains
与`left_contains`、`right_contains`判断逻辑相反。
#### 1.5.in、not_in
相当于`sql`中的`in`操作符,用于检查某个值是否包含在给定的多个可能值。例如`name in ("jack","mary")`
#### 1.6.matches、not_matches
与指定的Java正则表达式匹配或不匹配。例如`name matches "ja.*"`
## 🎋 分支说明
| 分支 | 说明 |
| ----------- | ------------------------------------------------------------ |
| release-1.6 | 1.新增字段定位器`FieldUsedLocator`:用于定位出入参字段被使用在那些规则块(`DruleBlock`)中。
2.新增规则会话执行异常处理器`RuleExecuteExceptionHandler`,用于规则执行异常时进行处理,例如异常兜底输出。
3.新增规则会话创建后回调函数`AfterCreateSessionCallback`。用于解决调度器在某些场景需要加工规则会话时的不便。 |
| release-1.5 | 1.新增8种条件运算符:包含(左),包含(右),不包含(左),不包含(右),存在于,不存在于,正则匹配,正则不匹配。
2.规则服务调度器支持直接通过入参对象执行规则 |
| release-1.4 | 1.新增规则服务调度器,提供了统一管理规则服务的功能。
2.`RuleService`新增事实对象类型选择器`factClassSelector`,用于获取规则出入参对象类型。 |
| release-1.3 | 1.新增中文转译器`ChineseTranslation`,支持将规则块转译为中文。
2.新增文本差异对比工具`DiffHandleUtils`,将转译后的规则内容进行差异对比,支持转`html`可视化显示。
3.修复问题:节点类型中新增布尔类型 |
| release-1.2 | 1.新增效验可视化规则块的方法:`DefaultDruleCompile.validateRules`
2.根据类型的选择不同的值处理逻辑:`Operator.Eq.doCompile` |
| release-1.1 | 新增`drule-execute`模块。基于KieBase构建可执行的规则服务`RuleService`,统一执行框架,并对部分过程开放接口,允许自定义实现。 |
| release-1.0 | 完成初版的规则对象配置和规则编译功能。
1.支持根据注解描述规则对象,转换为`TreeNode`结构;
2.支持简单的规则编译功能,不支持函数;
3.支持6种简单条件运算符:等于、不等于、小于、小于等于、大于、大于等于; |
## 📦 合作与支持
感谢大家对此项目的支持,如有其他需要,可直接联系本人。
QQ:1298894906
邮箱:1298894906@qq.com