BladeX框架的轻量级规则引擎,提供简单易用的规则执行和编排能力。
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-starter-literule</artifactId>
<version>${blade.tool.version}</version>
</dependency>
import org.springblade.core.literule.core.RuleContextComponent;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrderContext extends RuleContextComponent {
private String orderId;
private BigDecimal amount;
private String paymentType;
private String status;
private Address shippingAddress;
// 其他业务字段...
}
import org.springblade.core.literule.annotation.LiteRuleComponent;
@Slf4j
@LiteRuleComponent("orderValidateRule")
public class OrderValidateRule extends RuleComponent {
@Override
protected void process() throws Exception {
OrderContext context = getContextBean(OrderContext.class);
// 执行业务逻辑
if (StringUtils.isEmpty(context.getOrderId())) {
context.addError("订单ID不能为空");
return;
}
if (context.getAmount() == null || context.getAmount().compareTo(BigDecimal.ZERO) <= 0) {
context.addError("订单金额无效");
return;
}
log.info("[规则1] 订单校验通过:{}", context.getOrderId());
}
}
import org.springblade.core.literule.annotation.LiteRuleComponent;
@Slf4j
@LiteRuleComponent("paymentRouteRule")
public class PaymentRouteRule extends SwitchRuleComponent {
@Override
protected List<String> process() throws Exception {
OrderContext context = getContextBean(OrderContext.class);
String paymentType = context.getPaymentType();
log.info("[规则3] 支付路由选择:{}", paymentType);
// 根据支付类型返回不同的规则ID
if ("ALIPAY".equals(paymentType)) {
return Collections.singletonList("alipayRule");
} else if ("WECHAT".equals(paymentType)) {
return Collections.singletonList("wechatPayRule");
} else if ("BANK".equals(paymentType)) {
return Collections.singletonList("bankPayRule");
} else {
context.addError("不支持的支付方式:" + paymentType);
return Collections.emptyList();
}
}
}
@EngineComponent("orderChain")
public class OrderRuleBuilder implements RuleBuilder {
@Override
public RuleChain build() {
// 创建支付处理分支规则
RuleChain paymentRule = LiteRule.SWITCH("paymentRouteRule")
.TO("alipayRule", "wechatPayRule", "bankPayRule")
.build();
// 创建完整规则链
return LiteRule.THEN("orderValidateRule", "orderAmountRule")
.THEN(paymentRule)
.build();
}
}
import org.springblade.core.literule.provider.LiteRuleResponse;
@Autowired
private RuleEngineExecutor ruleEngine;
public void processOrder(OrderRequest request) {
// 构建上下文
OrderContext context = OrderContext.builder()
.orderId(request.getOrderId())
.amount(request.getAmount())
.paymentType(request.getPaymentType())
.shippingAddress(request.getAddress())
.build();
// 构建配置
RuleConfig config = RuleConfig.builder()
.enableTimeMonitor(true)
.printExecutionTime(true)
.enableLogging(true)
.build();
// 执行规则链
LiteRuleResponse<OrderContext> response = ruleEngine.execute(
"orderChain",
context,
config
);
// 处理响应
if (response.isSuccess()) {
log.info("规则执行成功,耗时: {}ms", response.getExecutionTime());
} else {
log.error("规则执行失败: {}", response.getMessage());
// 获取详细错误信息
context.getErrorMessages().forEach(error -> log.error("错误: {}", error));
}
}
@Autowired
private RuleEngineExecutor ruleEngine;
@Autowired
@Qualifier("ruleExecutorThreadPool")
private ThreadPoolExecutor threadPool;
public CompletableFuture<LiteRuleResponse<OrderContext>> processOrderAsync(OrderRequest request) {
// 构建上下文
OrderContext context = OrderContext.builder()
.orderId(request.getOrderId())
.amount(request.getAmount())
.paymentType(request.getPaymentType())
.build();
// 异步执行规则链
return ruleEngine.executeAsync(
"orderChain",
context,
threadPool
).thenApply(response -> {
if (response.isSuccess()) {
log.info("异步规则执行成功,耗时: {}ms", response.getExecutionTime());
} else {
log.error("异步规则执行失败: {}", response.getMessage());
}
return response;
});
}
规则是业务逻辑的最小执行单元,分为两种类型:
规则链定义了规则的执行顺序,支持三种组合方式:
在规则执行过程中传递数据和状态的载体,包含:
控制规则执行的行为,包含:
规则引擎会自动缓存构建好的规则链,提高执行效率。缓存支持以下配置:
literule:
cache:
enabled: true # 是否启用缓存
在应用启动时预加载所有规则,提前发现配置错误,减少首次执行的延迟:
literule:
preload:
enabled: true # 是否启用预加载
控制并行规则执行的行为:
literule:
execution:
timeout: 30000 # 默认超时时间(毫秒)
enable-parallel: true # 是否启用并行执行
max-parallel-threads: 10 # 最大并行线程数
规则引擎会自动检测规则链中的循环依赖,避免无限递归执行。
blade-starter-literule/
├── annotation/ # 注解
│ ├── EngineComponent.java # 引擎组件注解
│ └── RuleComponent.java # 规则组件注解
│
├── builder/ # 规则构建
│ ├── LiteRule.java # 规则构建器
│ ├── RuleBuilder.java # 规则构建器接口
│ ├── RuleBuilderExecutor.java # 规则构建器执行器
│ └── chain/ # 规则链构建器
│ ├── AbstractRuleChain.java # 规则链抽象基类
│ ├── ParallelRuleChain.java # 并行规则链构建器
│ ├── RuleChain.java # 并行规则链接口
│ ├── SwitchRuleChain.java # 分支规则链构建器
│ └── ThenRuleChain.java # 顺序规则链构建器
│
├── config/ # 配置类
│ ├── AbstractComponentRegistrar.java # 组件注册器抽象基类
│ ├── EngineComponentRegistrar.java # 引擎组件注册器
│ ├── RuleComponentRegistrar.java # 规则组件注册器
│ ├── RuleEngineAutoConfiguration.java # 规则引擎自动配置
│ └── RuleEngineProperties.java # 规则引擎配置属性
│
├── context/ # 上下文管理
│ ├── RuleContextHolder.java # 规则上下文持有者
│ └── RuleContextManager.java # 规则上下文管理器
│
├── core/ # 核心实现
│ ├── AbstractBaseRule.java # 规则基类
│ ├── AbstractRule.java # 普通规则抽象实现
│ ├── AbstractRuleContext.java # 规则上下文抽象实现
│ └── AbstractSwitchRule.java # 分支规则抽象实现
│
├── engine/ # 规则引擎执行
│ ├── DefaultRuleEngineExecutor.java # 默认规则引擎执行器
│ ├── RuleEngineExecutor.java # 规则引擎执行器接口
│ └── RulePreloadRunner.java # 规则预加载服务
│
├── exception/ # 异常
│ └── RuleException.java # 规则异常
│
└── provider/ # 接口和模型
├── Rule.java # 规则接口
├── RuleConfig.java # 规则配置类
├── RuleContext.java # 规则上下文接口
├── RuleResponse.java # 规则响应类
└── SwitchRule.java # 分支规则接口
参考 org.springblade.test.literule.LiteRuleTest
类,提供了完整的使用示例。