springboot集成drools的方式三(@Configuration)
采用@Configuration自动配置,是springboot项目最常用的的做法。
maven配置
详细的配置见码云上的代码工程:springbootDroolsAutoConfiguration
<dependencies>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>6.5.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>6.5.0.Final</version>
</dependency>
<!--<dependency>-->
<!--<groupId>org.kie</groupId>-->
<!--<artifactId>kie-spring</artifactId>-->
<!--<version>6.5.0.Final</version>-->
<!--</dependency>-->
</dependencies>
代码
编写配置类DroolsAutoConfiguration
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.*;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
//import org.kie.spring.KModuleBeanFactoryPostProcessor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import java.io.IOException;
@Configuration
public class DroolsAutoConfiguration {
private static final String RULES_PATH = "rules/";
@Bean
@ConditionalOnMissingBean(KieFileSystem.class)
public KieFileSystem kieFileSystem() throws IOException {
KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
for (Resource file : getRuleFiles()) {
kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8"));
}
return kieFileSystem;
}
private Resource[] getRuleFiles() throws IOException {
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");
}
@Bean
@ConditionalOnMissingBean(KieContainer.class)
public KieContainer kieContainer() throws IOException {
final KieRepository kieRepository = getKieServices().getRepository();
kieRepository.addKieModule(new KieModule() {
public ReleaseId getReleaseId() {
return kieRepository.getDefaultReleaseId();
}
});
KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem());
kieBuilder.buildAll();
return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}
private KieServices getKieServices() {
return KieServices.Factory.get();
}
@Bean
@ConditionalOnMissingBean(KieBase.class)
public KieBase kieBase() throws IOException {
return kieContainer().getKieBase();
}
@Bean
@ConditionalOnMissingBean(KieSession.class)
public KieSession kieSession() throws IOException {
return kieContainer().newKieSession();
}
//下面这个需要额外导入kie-spring依赖
// <dependency>
// <groupId>org.kie</groupId>
// <artifactId>kie-spring</artifactId>
// <version>6.5.0.Final</version>
// </dependency>
// @Bean
// @ConditionalOnMissingBean(KModuleBeanFactoryPostProcessor.class)
// public KModuleBeanFactoryPostProcessor kiePostProcessor() {
// return new KModuleBeanFactoryPostProcessor();
// }
}
编写DroolRuleController类,用于测试
import com.pingan.core.entity.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.kie.api.KieBase;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Slf4j
@Controller
public class DroolRuleController {
@Autowired
private KieBase kieBase;
//http://localhost:8080/rule
@RequestMapping("/rule")
@ResponseBody
public String rule(){
//StatefulKnowledgeSession
KieSession kieSession = kieBase.newKieSession();
UserInfo userInfo = new UserInfo();
userInfo.setUsername("superbing");
userInfo.setTelephone("13618607409");
kieSession.insert(userInfo);
kieSession.setGlobal("log",log);
int firedCount = kieSession.fireAllRules();
kieSession.dispose();
System.out.println("触发了" + firedCount + "条规则");
return "触发了" + firedCount + "条规则";
}
}
编写个单元测试类UserDroolTest
import com.pingan.core.entity.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.api.KieBase;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
@Slf4j
public class UserDroolTest {
@Autowired
private KieBase kieBase;
@Test
public void rule(){
//StatefulKnowledgeSession
KieSession kieSession = kieBase.newKieSession();
UserInfo userInfo = new UserInfo();
userInfo.setUsername("superbing");
userInfo.setTelephone("13618607409");
kieSession.insert(userInfo);
kieSession.setGlobal("log",log);
int firedCount = kieSession.fireAllRules();
kieSession.dispose();
System.out.println("触发了" + firedCount + "条规则");
}
}