背景:
需要实现规则的动态发布,更新,删除等动作。且规则文件有很多个,希望根据文件名称触发指定规则。
实现:
研究了一下drools,网上结合网上找的资料和自己研究,实现如下:
定义drools的bean
package cn.mime.rule.platform.engine.config;
import org.kie.api.KieServices;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieRepository;
import org.kie.api.builder.model.KieModuleModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DroolsConfig {
@Bean
KieServices getKieService() {
KieServices kieServices = KieServices.Factory.get();
return kieServices;
}
@Bean
KieRepository getKieRepository() {
KieServices kieServices = KieServices.Factory.get();
return kieServices.getRepository();
}
@Bean
KieModuleModel getKieModule() {
KieServices kieServices = KieServices.Factory.get();
return kieServices.newKieModuleModel();
}
@Bean
KieFileSystem getKieFileSystem() {
KieServices kieServices = KieServices.Factory.get();
return kieServices.newKieFileSystem();
}
}
当然你也可以定义在你需要的地方,只要保证能够使用相同的对象就行了,不能每次都kieServices.newKieFileSystem() 这样出来是不同的对象。会覆盖之前的规则文件等。
package cn.mime.rule.platform.engine.business;
import cn.mime.platform.regular.RuleResult;
import cn.mime.rule.platform.common.model.engine.EventParam;
import cn.mime.rule.platform.common.model.rpm.EventRd;
import java.util.List;
import java.util.Map;
public interface DroolsBusiness {
/**
* build所有规则
*/
void buildAllRules();
/**
* build规则
* @param
*/
void buildRules(String fileName, String code);
/**
* 删除规则
* @param fileName
*/
void deleteRules(String fileName);
/**
* 触发规则
* @param eventParam
*/
List<RuleResult> fireRules(Map<String, Ob