Drools rule 구문의 글로벌 변수(global variables)

Drools rule 구문의 글로벌 변수(global variables)
Drools 규칙 파일의 전역 변수(global variables)는 규칙 파일 코드와 자바 코드 간의 상호작용의 교량이다. 우리는 전역 변수를 이용하여 규칙 파일의 프로그램이 자바 코드의 기본 변수, 캐시 정보나 인터페이스 서비스 등을 사용하도록 할 수 있다.
기본 구문:
글로벌 유형 변수 이름
예를 들면 다음과 같습니다.
global java.util.List list
 
java 글로벌 변수 설정:
   public void setGlobal(final String identifier,final Object value)
예를 들면 다음과 같습니다.
자바 코드에서 글로벌 변수 list 값을 설정하려면:
   List list = new ArrayList<>();    statelessKieSession.setGlobal("list", list);
java에서list에 값을 설정하면 규칙 파일 코드가list의 데이터에 접근할 수 있습니다.
java에서 전역 변수를 가져오려면:
    public Object getGlobal(final String identifier) 
    public Globals getGlobals() 
글로벌 변수는 fact와 다릅니다.
규칙 엔진 중fact 수정에 대해 규칙 엔진은 알고리즘에 따라 결정 트리를 동태적으로 업데이트하고 일부 규칙의 집행을 다시 활성화하며 전역 변수는 규칙 엔진의 결정 트리에 아무런 영향을 주지 않는다.
    
글로벌 변수의 일반적인 사용법:
전역 변수는 규칙 파일에서의 작용과 자바 코드에서의 작용이 많지 않기 때문에 우리는 규칙 파일 코드와 자바 코드 간의 소통의 다리를 맡을 수 있다.
규칙 파일에서 글로벌 변수를 사용하여 규칙 파일의 불변의 마수를 나타낼 수 있습니다.
예를 들면 다음과 같습니다.
package com.beaver.drools.example.fact
import java.util.UUID
import com.beaver.drools.common.model.RuleResult

global Integer MAX_AGE
rule "GlobalVariableMagicNumberExample"

when
    $p : Person(age > MAX_AGE)
then
    $p.getRuleResultDetail().add(RuleResult.REJECT,"age > "+ MAX_AGE);
end
package com.beaver.drools.example.start;

import com.beaver.drools.example.fact.Person;
import com.beaver.drools.util.KieSessionUtil;
import org.kie.api.runtime.StatelessKieSession;

import java.nio.charset.StandardCharsets;

/**
 * Created by beaver on 2017/3/27.
 */
public class GlobalVariableMagicNumberExample {
    private static final int MAX_AGE = 88;
    
    public static void main(String[] args) {
        KieSessionUtil kieSessionUtil = new KieSessionUtil();
        kieSessionUtil.addFromClassPath("/rules/test/GlobalVariableMagicNumberExample.drl", StandardCharsets.UTF_8.name());
        StatelessKieSession statelessKieSession = kieSessionUtil.build().newStatelessKieSession();
        
        statelessKieSession.setGlobal("MAX_AGE",MAX_AGE );
    
        Person person = new Person();
        person.setAge(89);
        System.out.println(person);
        KieSessionUtil.excuteInsertObject(statelessKieSession, person);
        System.out.println(person);
        
    }
}

java 코드:
private static final int MAX_AGE = 88;
statelessKieSession.setGlobal("MAX_AGE",MAX_AGE );

규칙 파일 코드:
$p : Person(age > MAX_AGE)

규칙 파일은 자바에서 제공하는 정보를 사용할 수 있습니다. 마찬가지로 규칙 파일도 자바 프로그램에서 제공하는 변수에 정보를 쓸 수 있습니다.
예를 들면 다음과 같습니다.
package com.beaver.drools.example.fact
import java.util.UUID

global java.util.List list
global com.beaver.drools.example.service.impl.EmailServiceImpl emailService
rule "GlobalVariablesExample"

when
    eval(true)
then
    list.add(UUID.randomUUID());
    emailService.sendSMS("send ");

end

규칙 파일에서 코드가list에 어떤 값을 썼습니다. 자바 코드의 실행 결과를 보십시오.
public class GlobalVariableExample {
    private static EmailServiceImpl emailService = new EmailServiceImpl();
    
    public static void main(String[] args) {
        KieSessionUtil kieSessionUtil = new KieSessionUtil();
        kieSessionUtil.addFromClassPath("/rules/test/GlobalVariablesExample.drl", StandardCharsets.UTF_8.name());
        StatelessKieSession statelessKieSession = kieSessionUtil.build().newStatelessKieSession();
        
        List list = new ArrayList<>();
        statelessKieSession.setGlobal("list", list);
        statelessKieSession.setGlobal("emailService", emailService);
        
        System.out.println(list);
        
        KieSessionUtil.excuteInsertObject(statelessKieSession, new Object());
        KieSessionUtil.excuteInsertObject(statelessKieSession, new Object());
        System.out.println(list);
    }
}

실행 결과:
[] sendSms: send send Sms:send [62e765d2-4924-46ec-89b3-83819a1cd22a, f64b0685-9b32-4493-9e13-41c53a8805b3]에서 [62e765d2-4924-46ec-89b3-83819a1cd22a, f64b0685-9b32-4493-9e13-441c53a8805b3] Process finished with with exit
전역 변수는 자바 코드의 인터페이스 변수로 설정하여 규칙 파일이 자바의 서비스를 호출하도록 할 수 있습니다.
규칙 파일 코드에서 우리는 전역 변수를 이용하여 자바 서비스 인터페이스를 호출하여 실현할 수 있다.
예를 들어 자바 인터페이스 구현(원격 RPC처럼 가능):
package com.beaver.drools.example.service.impl;

import com.beaver.drools.example.fact.Person;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by beaver on 2017/3/27.
 */
public class PersonServiceImpl {
    
    public List queryPersons() {
        List personList = new ArrayList<>();
        Person person = new Person();
        person.setAge(55);
        personList.add(person);
        Person person2 = new Person();
        person2.setAge(30);
        
        return personList;
    }
    
    public int savePerson(List personList) {
        System.out.println("save persons" + personList);
        return personList.size();
    }
    
}

규칙 파일:
package com.beaver.drools.example.fact
import com.beaver.drools.example.service.impl.PersonServiceImpl
import java.util.Arrays
import java.util.List

global PersonServiceImpl personService
rule "GlobalVariableJavaServiceExample"

when
    Object()
    $p : Person(age > 44) from personService.queryPersons()
then
    personService.savePerson(Arrays.asList( $p));
end

사용하는 자바 서비스는 다음과 같습니다: 자바 코드:
package com.beaver.drools.example.start;

import com.beaver.drools.example.service.impl.PersonServiceImpl;
import com.beaver.drools.util.KieSessionUtil;
import org.kie.api.runtime.StatelessKieSession;

import java.nio.charset.StandardCharsets;

/**
 * Created by beaver on 2017/3/27.
 */
public class GlobalVariableJavaServiceExample {
    private static PersonServiceImpl personService = new PersonServiceImpl();
    
    public static void main(String[] args) {
        KieSessionUtil kieSessionUtil = new KieSessionUtil();
        kieSessionUtil.addFromClassPath("/rules/test/GlobalVariableJavaServiceExample.drl", StandardCharsets.UTF_8.name());
        StatelessKieSession statelessKieSession = kieSessionUtil.build().newStatelessKieSession();
        
        statelessKieSession.setGlobal("personService", personService);
        statelessKieSession.execute(new Object());
    }
}

콘솔 출력:
save persons[Person{name='null', age=55, address=null, exGirlfriend=null, message='null', ruleResultDetail=RuleResultDetail{ruleResultDetailInfo={}}}] Process finished with exit code 0
java 서비스는 두 사람을 제공하지만 조건을 충족시키는 것은 하나이기 때문에save 정보의 출력은 하나입니다.

좋은 웹페이지 즐겨찾기