>  기사  >  Java  >  SpringBoot2에 Drools 규칙 엔진을 통합하는 방법

SpringBoot2에 Drools 규칙 엔진을 통합하는 방법

PHPz
PHPz앞으로
2023-05-16 23:19:041254검색

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 규칙 엔진을 통합하여 효율적인 비즈니스 규칙 달성

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. 시연 사례

1. 규칙 파일


Rule 1


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);
end
Rule 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);
end
Rule 설명:

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제