之前快速使用了决策表,本次接着集成springboot。
<drools.version>7.42.0.Final</drools.version>
<springboot.version>2.2.5.RELEASE</springboot.version>
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope> <optional>true</optional> </dependency> -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
server:
port: 8000
spring:
application:
name: @project.artifactId@
profiles:
active: local
thymeleaf:
cache: false
app:
drools:
# 配置Drools决策表文件路径,可多个
xlsFilePaths:
- D:/temp/person_check.xls
@SpringBootApplication
public class BootDrools {
public static void main(String[] args) {
System.setProperty("drools.dateformat","yyyy-MM-dd");
SpringApplication.run(BootDrools.class, args);
}
}
KieUtilService
KieHelper
私有单例化,只有首次启动和规则重刷时才发生变更@Service
@ConfigurationProperties(prefix = "app.drools")
@Slf4j
public class KieUtilService {
// @Autowired
// private DroolsRuleService droolsRuleService;
private List<String> xlsFilePaths = new ArrayList<>();
private KieHelper kieHelper;
private final SpreadsheetCompiler compiler = new SpreadsheetCompiler();
@PostConstruct
public void init() {
reload();
}
KieSession
KieHepler
、KieContainer
、KieBase
和KieSession
的关系/**
* 触发规则
* @param fact
*/
public void fire(Object fact) {
this.fire(fact, new FireOption().setFireLimit(-1));
}
/**
* 触发规则,指定触发配置
* @param fact
* @param fireLimit
*/
public void fire(Object fact, FireOption option) {
log.info(">> fire, fact:{}, option:{}", fact, option);
KieSession session = kieHelper.build().newKieSession();
//Drools全局变量
if(CollUtil.isNotEmpty(option.getGlobalVariables())) {
for(Entry<String, Object> entry: option.getGlobalVariables().entrySet()) {
session.setGlobal(entry.getKey(), entry.getValue());
}
}
//fact放入工作内容
session.insert(fact);
//指定聚焦议程组
if(StrUtil.isNotBlank(option.getAgendaGroup())) {
session.getAgenda().getAgendaGroup(option.getAgendaGroup()).setFocus();
}
//触发数量配置
int fireLimit = option.getFireLimit()==null ? -1 : option.getFireLimit();
int count = session.fireAllRules(fireLimit);
log.info("本次触发的规则数:{}", count);
session.dispose(); //方法级KieSession
log.info("<< fire, fact:{}", fact);
}
KieHepler
实例/**
* 重新加载外置的决策表EXCEL规则文件
*/
public void reload() {
log.info(">> reload");
log.info("配置的xls规则文件列表:{}", xlsFilePaths.toString());
// 载入规则
this.kieHelper = null;
KieHelper newKieHelper = new KieHelper();
try {
for (String path : xlsFilePaths) {
InputStream is = new FileInputStream(new File(path));
String drl = compiler.compile(is, InputType.XLS);
log.info("{} to compile drl:\n{}", path, drl);
newKieHelper.addContent(drl, ResourceType.DRL);
}
// 测试任意drl来源,测试通过
// List<DroolsRule> listAll = droolsRuleService.listAll();
// listAll.forEach(o -> newKieHelper.addContent(o.getDrlContent(), ResourceType.DRL));
} catch (FileNotFoundException e) {
log.error("文件读取异常", e);
throw new RuntimeException("文件读取异常", e);
}
// drl文本语法校验
verifyDrl(newKieHelper);
this.kieHelper = newKieHelper;
log.info("<< reload");
}
@RestController
public class TestCtrller {
@Value("${spring.application.name}")
private String app_name;
@Autowired
private KieUtilService kieUtilService;
// @Autowired
// private AppDroolsYmlConfigBean ymlBean;
@GetMapping("/hello")
public Object hello() {
return app_name + "@" + LocalDateTime.now().toString();
}
@GetMapping("/rule/fire")
public Object ruleFire(PersonInfoEntity entity) {
kieUtilService.fire(entity);
// kieUtilService.fire(entity, new FireOption().setAgendaGroup("sign"));
return entity;
}
@GetMapping("/rule/reload")
public Object ruleReload() {
kieUtilService.reload();
return "OK";
}
}
原文:https://www.cnblogs.com/noodlerkun/p/13644648.html