1. Drools 엔진 소개
1. 기본 소개
Drools는 복잡하고 변경 가능한 규칙을 하드코딩에서 해방시켜 규칙 스크립트 형식으로 저장할 수 있는 오픈 소스 기반의 규칙 엔진입니다. 파일에서는 코드를 수정하거나 컴퓨터를 다시 시작하지 않고도 온라인 환경에서 규칙 변경 사항이 즉시 적용될 수 있습니다. 이는 기업 정책에 쉽게 접근하고, 조정 및 관리가 용이하다는 특징을 갖고 있으며, 오픈 소스 비즈니스 규칙 엔진으로서 업계 표준을 준수하며 빠르고 효율적입니다.
2. 규칙 구문
(1), 데모 drl 파일 형식
package droolRule ; import org.slf4j.Logger import org.slf4j.LoggerFactory ; dialect "java" rule "paramcheck1" when then final Logger LOGGER = LoggerFactory.getLogger("param-check-one 规则引擎") ; LOGGER.info("参数"); end
(2), 구문 설명
· 파일 형식
은 .drl, xml 파일 또는 하드 코딩된 Java 코드 블록일 수 있습니다.
· package
규칙 파일에서 패키지를 정의해야 하며 규칙 파일의 첫 번째 줄에 배치해야 합니다.
· import
규칙 파일에서 사용하는 외부 변수는 클래스일 수 있습니다. 또는 클래스의 액세스 가능한 정적 메소드
· rule
은 규칙을 정의합니다. paramcheck1 규칙 이름입니다. 규칙은 일반적으로 속성, 조건, 결과의 세 부분으로 구성됩니다.
2. SpringBoot 프레임워크 통합
1. 프로젝트 구조
SpringBoot2 Drools 규칙 엔진을 통합하여 효율적인 비즈니스 규칙 달성
2 dependency<!--drools规则引擎--> <dependency> <groupid>org.drools</groupid> <artifactid>drools-core</artifactid> <version>7.6.0.Final</version> </dependency> <dependency> <groupid>org.drools</groupid> <artifactid>drools-compiler</artifactid> <version>7.6.0.Final</version> </dependency> <dependency> <groupid>org.drools</groupid> <artifactid>drools-templates</artifactid> <version>7.6.0.Final</version> </dependency> <dependency> <groupid>org.kie</groupid> <artifactid>kie-api</artifactid> <version>7.6.0.Final</version> </dependency> <dependency> <groupid>org.kie</groupid> <artifactid>kie-spring</artifactid> <version>7.6.0.Final</version> </dependency>3. 구성 파일
@Configuration public class RuleEngineConfig { private static final Logger LOGGER = LoggerFactory.getLogger(RuleEngineConfig.class) ; private static final String RULES_PATH = "droolRule/"; private final KieServices kieServices = KieServices.Factory.get(); @Bean public KieFileSystem kieFileSystem() throws IOException { KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); Resource[] files = resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "*.*"); String path = null; for (Resource file : files) { path = RULES_PATH + file.getFilename(); LOGGER.info("path="+path); kieFileSystem.write(ResourceFactory.newClassPathResource(path, "UTF-8")); } return kieFileSystem; } @Bean public KieContainer kieContainer() throws IOException { KieRepository kieRepository = kieServices.getRepository(); kieRepository.addKieModule(kieRepository::getDefaultReleaseId); KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem()); kieBuilder.buildAll(); return kieServices.newKieContainer(kieRepository.getDefaultReleaseId()); } @Bean public KieBase kieBase() throws IOException { return kieContainer().getKieBase(); } @Bean public KieSession kieSession() throws IOException { return kieContainer().newKieSession(); } @Bean public KModuleBeanFactoryPostProcessor kiePostProcessor() { return new KModuleBeanFactoryPostProcessor(); } }이로써 환경 통합이 완료됩니다.
3. 시연 사례
dialect "java" rule "paramcheck1" salience 99 when queryParam : QueryParam(paramId != null && paramSign.equals("+")) resultParam : RuleResult() then final Logger LOGGER = LoggerFactory.getLogger("param-check-one 规则引擎") ; LOGGER.info("参数:getParamId="+queryParam.getParamId()+";getParamSign="+queryParam.getParamSign()); RuleEngineServiceImpl ruleEngineService = new RuleEngineServiceImpl() ; ruleEngineService.executeAddRule(queryParam); resultParam.setPostCodeResult(true); endRule 2
dialect "java" rule "paramcheck2" salience 88 when queryParam : QueryParam(paramId != null && paramSign.equals("-")) resultParam : RuleResult() then final Logger LOGGER = LoggerFactory.getLogger("param-check-two 规则引擎") ; LOGGER.info("参数:getParamId="+queryParam.getParamId()+";getParamSign="+queryParam.getParamSign()); RuleEngineServiceImpl ruleEngineService = new RuleEngineServiceImpl() ; ruleEngineService.executeRemoveRule(queryParam); resultParam.setPostCodeResult(true); endRule 설명: A와 salience의 값이 클수록 우선순위가 높아집니다. B 규칙 흐름: paramId가 null이 아니고 매개변수 식별자가 +인 경우 규칙을 추가하고 - 서명을 하면 규칙을 제거합니다. 2. 규칙 실행 코드
@Service public class RuleEngineServiceImpl implements RuleEngineService { private static final Logger LOGGER = LoggerFactory.getLogger(RuleEngineServiceImpl.class) ; @Override public void executeAddRule(QueryParam param) { LOGGER.info("参数数据:"+param.getParamId()+";"+param.getParamSign()); ParamInfo paramInfo = new ParamInfo() ; paramInfo.setId(param.getParamId()); paramInfo.setParamSign(param.getParamSign()); paramInfo.setCreateTime(new Date()); paramInfo.setUpdateTime(new Date()); ParamInfoService paramInfoService = (ParamInfoService)SpringContextUtil.getBean("paramInfoService") ; paramInfoService.insertParam(paramInfo); } @Override public void executeRemoveRule(QueryParam param) { LOGGER.info("参数数据:"+param.getParamId()+";"+param.getParamSign()); ParamInfoService paramInfoService = (ParamInfoService)SpringContextUtil.getBean("paramInfoService") ; ParamInfo paramInfo = paramInfoService.selectById(param.getParamId()); if (paramInfo != null){ paramInfoService.removeById(param.getParamId()) ; } } }3. 규칙 호출 인터페이스
@RestController @RequestMapping("/rule") public class RuleController { @Resource private KieSession kieSession; @Resource private RuleEngineService ruleEngineService ; @RequestMapping("/param") public void param (){ QueryParam queryParam1 = new QueryParam() ; queryParam1.setParamId("1"); queryParam1.setParamSign("+"); QueryParam queryParam2 = new QueryParam() ; queryParam2.setParamId("2"); queryParam2.setParamSign("-"); // 入参 kieSession.insert(queryParam1) ; kieSession.insert(queryParam2) ; kieSession.insert(this.ruleEngineService) ; // 返参 RuleResult resultParam = new RuleResult() ; kieSession.insert(resultParam) ; kieSession.fireAllRules() ; } }
위 내용은 SpringBoot2에 Drools 규칙 엔진을 통합하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!