|
@@ -0,0 +1,122 @@
|
|
|
+package cn.iselab.mooctest.site.service.drools;
|
|
|
+
|
|
|
+
|
|
|
+import cn.iselab.mooctest.site.models.DroolsRule;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.kie.api.KieBase;
|
|
|
+import org.kie.api.builder.Message;
|
|
|
+import org.kie.api.builder.Results;
|
|
|
+import org.kie.api.io.ResourceType;
|
|
|
+import org.kie.internal.utils.KieHelper;
|
|
|
+
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @program: mooctest-site
|
|
|
+ * @mail: menduo96@gmail.com
|
|
|
+ * @author: menduo
|
|
|
+ * @create: 2019-05-29 13:38
|
|
|
+ **/
|
|
|
+@Slf4j
|
|
|
+public abstract class DroolsBaseService {
|
|
|
+
|
|
|
+ protected Map<String, KieBase> kieBaseMap;
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * 获取KieBase
|
|
|
+ * @param base
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public KieBase getKieBase(String base) {
|
|
|
+ if(!kieBaseMap.containsKey(base)) {
|
|
|
+ throw new IllegalArgumentException("kieBase不存在");
|
|
|
+ }
|
|
|
+ return kieBaseMap.get(base);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取所有规则
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public abstract Map<String,List<DroolsRule>> getAllRules();
|
|
|
+ public abstract Map<String,List<DroolsRule>> getRulesByBaseList(List<String> bases);
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 刷新内存中的规则
|
|
|
+ */
|
|
|
+ public final void refreshAll() {
|
|
|
+ long start = System.currentTimeMillis();
|
|
|
+ log.info("drools规则刷新开始...");
|
|
|
+ Map<String,List<DroolsRule>> map = this.getAllRules();
|
|
|
+ Map<String,KieBase> newKieBaseMap = new ConcurrentHashMap<>();
|
|
|
+ for (String key: map.keySet()) {
|
|
|
+ KieHelper kieHelper = this.newKieHelper(map.get(key).stream().map(DroolsRule::getRule).collect(Collectors.toList()));
|
|
|
+ newKieBaseMap.put(key, kieHelper.build());
|
|
|
+ }
|
|
|
+ this.kieBaseMap = newKieBaseMap;
|
|
|
+ log.info("drools规则刷新结束...,用时:[{}]ms.",System.currentTimeMillis() - start);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 局部刷新某个或某几个kieBase
|
|
|
+ * @param bases
|
|
|
+ */
|
|
|
+ public final void refreshBase(List<String> bases) {
|
|
|
+ long start = System.currentTimeMillis();
|
|
|
+ log.info("drools规则刷新开始...");
|
|
|
+ Map<String,List<DroolsRule>> map = this.getRulesByBaseList(bases);
|
|
|
+ for(String base: bases) {
|
|
|
+ List<String> rules = map.get(base).stream().map(DroolsRule::getRule).collect(Collectors.toList());
|
|
|
+ kieBaseMap.put(base,newKieHelper(rules).build());
|
|
|
+ }
|
|
|
+ log.info("drools:[{}]规则刷新结束...,用时:[{}]ms.",Arrays.toString(bases.toArray()),System.currentTimeMillis() - start);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private KieHelper newKieHelper(List<String> rules) {
|
|
|
+ KieHelper kieHelper = new KieHelper();
|
|
|
+ for(String rule:rules) {
|
|
|
+ kieHelper.addContent(rule, ResourceType.DRL);
|
|
|
+ }
|
|
|
+ Results results = kieHelper.verify();
|
|
|
+ for (Message message : results.getMessages()) {
|
|
|
+ log.error(">> Message ({}): {}", message.getLevel(), message.getText());
|
|
|
+ }
|
|
|
+ if (results.hasMessages(Message.Level.ERROR)) {
|
|
|
+ //最好邮件通知
|
|
|
+ throw new IllegalStateException("KieBase has error can not update success!");
|
|
|
+ }
|
|
|
+ return kieHelper;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private static String loadRules() {
|
|
|
+ // 从数据库加载的规则
|
|
|
+ String drl = "package rules;\n" +
|
|
|
+ "import cn.iselab.mooctest.site.models.User;\n" +
|
|
|
+ "import cn.iselab.mooctest.site.models.CaseExtends;\n" +
|
|
|
+ "dialect \"mvel\"\n" +
|
|
|
+ "\n" +
|
|
|
+ "rule \"test\"\n" +
|
|
|
+ " when\n" +
|
|
|
+ " $u: User();\n" +
|
|
|
+ " $e: CaseExtends(ownerId == $u.id);\n" +
|
|
|
+ " then\n" +
|
|
|
+ " System.out.println(\"OK!\");\n" +
|
|
|
+ " System.out.println($u.getName() +\"--可以看见case\");\n" +
|
|
|
+ "end";
|
|
|
+
|
|
|
+
|
|
|
+ return drl;
|
|
|
+
|
|
|
+ }
|
|
|
+}
|