Drools Spring 통합

1. 소개

이 빠른 자습서에서는 Drools를 Spring과 통합 할 것입니다. Drools를 막 시작했다면이 소개 기사를 확인하세요.

2. Maven 종속성

pom.xml 파일에 다음 종속성을 추가하여 시작하겠습니다 .

 org.drools drools-core 7.0.0.Final   org.kie kie-spring 7.0.0.Final 

최신 버전은 여기에서 drools-core 용으로, 여기에서 kie-spring 용으로 찾을 수 있습니다.

3. 초기 데이터

이제 예제에서 사용할 데이터를 정의하겠습니다. 여행 한 거리와 야간 할증료 플래그를 기반으로 라이드 요금을 계산할 것입니다.

다음은 사실 로 사용되는 간단한 개체입니다 .

public class TaxiRide { private Boolean isNightSurcharge; private Long distanceInMile; // standard constructors, getters/setters }

요금을 나타내는 데 사용할 다른 비즈니스 객체도 정의 해 보겠습니다.

public class Fare { private Long nightSurcharge; private Long rideFare; // standard constructors, getters/setters }

이제 택시 요금 계산을위한 비즈니스 규칙을 정의 해 보겠습니다.

global com.baeldung.spring.drools.model.Fare rideFare; dialect "mvel" rule "Calculate Taxi Fare - Scenario 1" when taxiRideInstance:TaxiRide(isNightSurcharge == false && distanceInMile < 10); then rideFare.setNightSurcharge(0); rideFare.setRideFare(70); end 

보시다시피 지정된 TaxiRide 의 총 요금을 계산하는 규칙이 정의되어 있습니다.

이 규칙은 TaxiRide 개체를 허용 하고 isNightSurcharge 속성이 false 이고 distanceInMile 속성 값이 10 미만 인지 확인한 다음 요금을 70으로 계산하고 nightSurcharge 속성을 0으로 설정합니다 .

계산 된 출력은 나중에 사용 하기 위해 Fare 개체로 설정됩니다 .

4. 봄 통합

4.1. Spring Bean 구성

이제 Spring 통합으로 이동해 보겠습니다.

TaxiFareCalculatorService 빈과 그 종속성 을 인스턴스화하는 스프링 빈 구성 클래스를 정의 할 것입니다 .

@Configuration @ComponentScan("com.baeldung.spring.drools.service") public class TaxiFareConfiguration { private static final String drlFile = "TAXI_FARE_RULE.drl"; @Bean public KieContainer kieContainer() { KieServices kieServices = KieServices.Factory.get(); KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); kieFileSystem.write(ResourceFactory.newClassPathResource(drlFile)); KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem); kieBuilder.buildAll(); KieModule kieModule = kieBuilder.getKieModule(); return kieServices.newKieContainer(kieModule.getReleaseId()); } } 

KieServices 는 Kie에서 제공하는 모든 서비스를 얻기위한 단일 포인트 항목 역할을하는 싱글 톤입니다. KieServicesKieServices.Factory.get ()을 사용하여 검색됩니다 .

다음으로 규칙 엔진을 실행하는 데 필요한 모든 개체에 대한 자리 표시 자인 KieContainer가져와야 합니다.

KieContainerKieFileSystem, KieBuilderKieModule을 포함한 다른 bean의 도움으로 빌드됩니다 .

KieBase 로 알려진 규칙 지식을 정의하는 데 필요한 모든 리소스의 컨테이너 인 KieModule 을 생성 해 보겠습니다.

KieModule kieModule = kieBuilder.getKieModule();

KieBase 는 규칙, 프로세스, 함수, 유형 모델과 같은 애플리케이션과 관련된 모든 지식을 포함하는 저장소이며 KieModule 내부에 숨겨져 있습니다 . KieBase가 로부터 얻어 질 수 KieContainer.

일단 KieModule가 생성됩니다, 우리는 만들 진행할 수 KieContainer - 포함 KieModule KieBase가 정의되었습니다. KieContainer은 모듈을 사용하여 생성된다 :

KieContainer kContainer = kieServices.newKieContainer(kieModule.getReleaseId());

4.2. 봄 서비스

결과를 처리하기 위해 Fact 객체를 엔진 에 전달하여 실제 비즈니스 로직을 실행하는 서비스 클래스를 정의 해 보겠습니다 .

@Service public class TaxiFareCalculatorService { @Autowired private KieContainer kieContainer; public Long calculateFare(TaxiRide taxiRide, Fare rideFare) { KieSession kieSession = kieContainer.newKieSession(); kieSession.setGlobal("rideFare", rideFare); kieSession.insert(taxiRide); kieSession.fireAllRules(); kieSession.dispose(); return rideFare.getTotalFare(); } } 

마지막으로, KieSession를 사용하여 만들어집니다 KieContainer의 인스턴스를. KieSession의 인스턴스는 입력 데이터가 삽입 될 수있는 곳이다. KieSession의 엔진과 상호 작용이 삽입 된 사실에 기초하여 규칙에 정의되어있는 실제 비즈니스 로직을 처리한다.

글로벌 (글로벌 변수와 마찬가지로)은 정보를 엔진에 전달하는 데 사용됩니다. setGlobal ( "key", value)을 사용하여 Global을 설정할 수 있습니다 . 이 예에서는 계산 된 택시 요금을 저장하기 위해 Fare 개체를 Global로 설정했습니다 .

우리는 제 4 장에서 설명하고있는 바와 같이, 규칙 에 작동하는 데이터가 필요 . kieSession .insert (taxiRide); 사용하여 세션에 Fact 를 삽입합니다 .

입력 Fact 설정이 완료되면 fireAllRules () 를 호출하여 비즈니스 로직을 실행하도록 엔진에 요청할 수 있습니다 .

마지막으로 dispose () 메서드를 호출하여 메모리 누수를 방지하기 위해 세션을 정리해야합니다 .

5. 실제 사례

이제 Spring 컨텍스트를 연결하여 Drools가 예상대로 작동하는지 확인할 수 있습니다.

@Test public void whenNightSurchargeFalseAndDistLessThan10_thenFixWithoutNightSurcharge() { TaxiRide taxiRide = new TaxiRide(); taxiRide.setIsNightSurcharge(false); taxiRide.setDistanceInMile(9L); Fare rideFare = new Fare(); Long totalCharge = taxiFareCalculatorService.calculateFare(taxiRide, rideFare); assertNotNull(totalCharge); assertEquals(Long.valueOf(70), totalCharge); }

6. 결론

이 기사에서는 간단한 사용 사례와 Drools Spring 통합에 대해 배웠습니다.

항상 그렇듯이 예제 및 코드 스 니펫의 구현은 GitHub에서 사용할 수 있습니다.