本编使用xls文件生成决策表,来动态跟新规则,废话不多说直接上代码
依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>7.0.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>7.0.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-decisiontables</artifactId> <version>7.0.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-templates</artifactId> <version>7.0.0.Final</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> <version>7.0.0.Final</version> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency> </dependencies>
启动类
import org.kie.internal.utils.KieHelper; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @SpringBootApplication public class WebApp { public static void main(String[] args) { SpringApplication.run(WebApp.class, args); } @Bean public KieHelper kieHelper() { return new KieHelper(); } }
controller
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * Created by Ares on 2018/6/23. */ @RestController @RequestMapping("/test") public class TestController { @Autowired private DroolsServiceImpl droolsService; @GetMapping("/showRults/{state}") public String showRults(@PathVariable("state") String state) { return droolsService.fireRule(Integer.valueOf(state)); } @GetMapping("/generateRule") public String generateRule() { return droolsService.generateRule(); } }
service
import com.zf.drools.domain.Account; import com.zf.drools.domain.Message; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.drools.decisiontable.InputType; import org.drools.decisiontable.SpreadsheetCompiler; import org.kie.api.KieBase; import org.kie.api.KieServices; import org.kie.api.builder.KieBuilder; import org.kie.api.builder.KieFileSystem; import org.kie.api.builder.Results; import org.kie.api.io.ResourceType; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.kie.internal.utils.KieHelper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.*; import java.util.Collection; /** * Created by Ares on 2018/6/23. */ @Service("droolsService") public class DroolsServiceImpl { @Autowired private KieHelper kieHelper; private KieBase build ; public String fireRule(int state) { if(build == null) build = kieHelper.getKieContainer().getKieBase(); // load up the knowledge base // KieServices ks = KieServices.Factory.get(); // KieContainer kContainer = ks.getKieClasspathContainer(); // // KieSession kSession = kContainer.newKieSession("ksession-rules"); KieSession kSession = build.newKieSession(); // go ! Message message = new Message(); message.setMessage("Hello World"); message.setStatus(state); kSession.insert(message);//插入 Account account = new Account(); account.setCount(15); kSession.insert(account);//插入 kSession.fireAllRules();//执行规则 kSession.dispose(); return account.getPrice() + ""; } public String generateRule() { // load up the knowledge base try { String fs = readXlsDrl("fs", "D:\\hywork\\scalatojava\\src\\main\\resources\\test.xls"); kieHelper.addContent(fs, ResourceType.DRL); // FileWriter fileWriter = new FileWriter("D:\\hywork\\scalatojava\\src\\main\\resources\\rules\\test.drl"); // fileWriter.write(fs); // fileWriter.close(); KieBase build = kieHelper.build(); } catch (IOException e) { e.printStackTrace(); } catch (InvalidFormatException e) { e.printStackTrace(); } return ""; } public String fireRule() { // load up the knowledge base String rules = ""; // Rules ru = rulesDao.getById(id); // if (ru != null && ru.getRules() != null) { // rules = ru.getRules(); // } KieServices kieServices = KieServices.Factory.get(); KieFileSystem kfs = kieServices.newKieFileSystem(); kfs.write("src/main/resources/rules/rules.drl", rules.getBytes()); KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll(); Results results = kieBuilder.getResults(); if (results.hasMessages(org.kie.api.builder.Message.Level.ERROR)) { System.out.println(results.getMessages()); throw new IllegalStateException("### errors ###"); } KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId()); KieBase kieBase = kieContainer.getKieBase(); KieSession ksession = kieBase.newKieSession(); Message message = new Message(); message.setStatus(0); ksession.insert(message); ksession.fireAllRules(); return message.getMessage(); } private String readXlsDrl(String type, String path) throws IOException, InvalidFormatException { InputStream is = null; if("cp".equals(type)) { is = this.getClass().getClassLoader().getResourceAsStream(path); }else if("fs".equals(type)) { try { is = new FileInputStream(path); } catch (FileNotFoundException e) { throw new RuntimeException("文件读取异常", e); } } SpreadsheetCompiler compiler = new SpreadsheetCompiler(); String drl = compiler.compile(is, InputType.XLS); System.out.println(drl); return drl; } }
决策表无法上传 只能截图了
运行输出规则
package com.galaxyyao.springbootdroolstest1;
//generated from Decision Table
import com.zf.drools.domain.Account;
// rule values at B9, header at B4
rule "Account_9"
when
a:Account(count < 30)
then
a.setPrice(18.5);
update(a);
end
// rule values at B10, header at B4
rule "Account_10"
when
a:Account(count > 30)
then
a.setPrice(15.5);
update(a);
end