ホームページ  >  記事  >  Java  >  Drools ルール エンジンを SpringBoot2 に統合する方法

Drools ルール エンジンを SpringBoot2 に統合する方法

PHPz
PHPz転載
2023-05-16 23:19:041256ブラウズ

1. Drools エンジンの概要

1. 基本的な紹介

Drools は、オープン ソースの Java ベースのルール エンジンです。複雑で変更可能なルールはハードコーディングから解放され、ルールスクリプトの形式でファイルに保存されるため、コードを変更したりマシンを再起動したりすることなく、ルールの変更をオンライン環境で即座に有効にすることができます。エンタープライズポリシーへのアクセスが容易、調整が容易、管理が容易という特徴があり、オープンソースのビジネスルールエンジンとして業界標準に準拠しており、高速かつ効率的です。

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

ルール ファイル内の packageは必須です。定義されています。ルール ファイルの最初の行に配置する必要があります。

#·import

ルール ファイルで使用される外部変数は、クラスまたはクラス。アクセス可能な静的メソッド;

· ルール

ルールを定義します。 paramcheck1 ルール名。ルールには通常、属性、条件、結果の 3 つの部分が含まれます。

2. SpringBoot フレームワークの統合

1. プロジェクト構造

SpringBoot2 は Drools ルール エンジンを統合して効率的なビジネス ルールを実現します

Drools ルール エンジンを SpringBoot2 に統合する方法

##2、コア依存関係


<!--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. ルール ファイル


ルール 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
ルール 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
ルールの説明:

A. salience の値が大きいほど、優先順位が高くなります;

B. ルールの処理: paramId がそうでない場合null、パラメータ識別子は「number」で、ルールの追加に使用され、-number はルールの削除に使用されます。

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() ;
  }
}

以上がDrools ルール エンジンを SpringBoot2 に統合する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。