Drools-퀵 가이드
모든 Java 엔터프라이즈 레벨 애플리케이션은 세 부분으로 나눌 수 있습니다.
- UI-사용자 인터페이스 (프런트 엔드)
- 차례로 데이터베이스에 연결되는 서비스 계층
- 비즈니스 계층
UI와 서비스 계층을 함께 처리하는 프레임 워크가 많이 있습니다 (예 : Spring 및 Struts). 그러나 Drools가 등장 할 때까지 비즈니스 로직을 처리하는 표준 방법이 없었습니다.
Drools는 무엇입니까?
Drools는 Business Logic integration Platform (BLiP). Java로 작성되었습니다. JBoss와 Red Hat, Inc.가 지원하는 오픈 소스 프로젝트입니다. Rete Pattern 매칭 알고리즘을 확장하고 구현합니다.
평신도의 관점에서 Drools는 비즈니스 프로세스 내에서 발견 된 논리와 데이터를 분리하고 추론 할 수있는 도구 모음입니다. 주목해야 할 두 가지 중요한 키워드는Logic 과 Data.
Drools는 두 가지 주요 부분으로 나뉩니다. Authoring 과 Runtime.
Authoring − 저작 과정에는 규칙 파일 (.DRL 파일) 생성이 포함됩니다.
Runtime − 작업 메모리 생성 및 활성화 처리가 포함됩니다.
규칙 엔진이란 무엇입니까?
Drools는 규칙 기반 접근 방식을 사용하여 전문가 시스템을 구현하는 규칙 엔진 또는 생산 규칙 시스템입니다. 전문가 시스템은 지식 표현을 사용하여 습득 한 지식을 추론에 사용할 수있는 지식 기반으로 처리하는 지식 기반 시스템입니다.
생산 규칙 시스템은 명제 및 1 차 논리를 간결하고 모호하지 않고 선언적인 방식으로 표현하기 위해 지식 표현에 중점을 둔 Turing입니다.
생산 규칙 시스템의 두뇌는 Inference Engine많은 규칙과 사실로 확장 될 수 있습니다. 추론 엔진은 사실과 데이터를 Production Rules (또는Productions 아니면 그냥 Rules -행동으로 이어지는 결론을 추론합니다.
생산 규칙은 지식 표현에 대한 추론을 위해 1 차 논리를 사용하는 두 부분으로 구성된 구조입니다. 비즈니스 규칙 엔진은 런타임 프로덕션 환경에서 하나 이상의 비즈니스 규칙을 실행하는 소프트웨어 시스템입니다.
규칙 엔진을 사용하면 "What to Do"가 아니라"How to do it.”
규칙이란 무엇입니까?
규칙은 " 일부 조건이 발생 하면 몇 가지 작업 을 수행하십시오."라고 표현되는 지식의 일부입니다.
When
<Condition is true>
Then
<Take desired Action>
규칙의 가장 중요한 부분은 when부품. 만약when 부분 만족, then 부품이 트리거됩니다.
rule <rule_name>
<attribute> <value>
when
<conditions>
then
<actions>
end
패턴 매칭
새 팩트 또는 기존 팩트를 프로덕션 규칙과 일치시키는 프로세스를 패턴 일치라고하며 추론 엔진에서 수행합니다. 다음을 포함하여 패턴 매칭에 사용되는 알고리즘이 많이 있습니다.
- Linear
- Rete
- Treat
- Leaps
Drools는 Rete 알고리즘을 구현하고 확장합니다. Drools Rete 구현은 ReteOO라고하며, 이는 Drools가 객체 지향 시스템을위한 Rete 알고리즘의 개선되고 최적화 된 구현을 가지고 있음을 의미합니다.
규칙 엔진의 장점
선언적 프로그래밍
규칙을 사용하면 어려운 문제에 대한 솔루션을 쉽게 표현하고 솔루션을 검증 할 수도 있습니다. 코드와 달리 규칙은 덜 복잡한 언어로 작성됩니다. 비즈니스 분석가는 규칙 세트를 쉽게 읽고 확인할 수 있습니다.
논리 및 데이터 분리
데이터는 도메인 개체에 있고 비즈니스 논리는 규칙에 있습니다. 프로젝트의 종류에 따라 이러한 분리가 매우 유리할 수 있습니다.
속도와 확장 성
Drools가 작성된 Rete OO 알고리즘은 이미 입증 된 알고리즘입니다. Drools의 도움으로 응용 프로그램의 확장 성이 매우 높아집니다. 변경 요청이 자주 발생하는 경우 기존 규칙을 수정하지 않고도 새 규칙을 추가 할 수 있습니다.
지식의 중앙화
규칙을 사용하여 실행 가능한 지식 저장소 (지식 기반)를 만듭니다. 비즈니스 정책에 대한 단일 진실 지점입니다. 이상적으로는 규칙이 너무 읽기 쉬워서 문서로도 사용할 수 있습니다.
도구 통합
Eclipse와 같은 도구는 규칙을 편집 및 관리하고 즉각적인 피드백, 검증 및 컨텐츠 지원을받는 방법을 제공합니다. 감사 및 디버깅 도구도 사용할 수 있습니다.
다음은 Drools 플러그인을 설치하기위한 전제 조건입니다.
- Java 1.5 이상 SE JDK
- Eclipse 4.2 (또는 모든 버전) 및 Drools 플러그인
Drools는 Java로 작성된 BRMS (Business Rule Management System)이므로이 섹션에서는 원하는 플러그인을 추가하는 방법을 다룹니다. 최대 Java 사용자가 Eclipse를 사용하는 것을 고려하여 Eclipse에 Drools 5.x.0 플러그인을 추가하는 방법을 살펴 보겠습니다.
1 단계 : 바이너리 다운로드
다음 링크에서 바이너리를 다운로드하십시오.
https://download.jboss.org/drools/release/5.3.0.Final/
다운로드가 완료되면 하드 디스크에 파일 압축을 풉니 다.
2 단계 : 소프트웨어 설치
Eclipse를 시작하고 도움말 → 새 소프트웨어 설치로 이동합니다. 다음 스크린 샷에 표시된대로 추가를 클릭합니다.
그런 다음 여기에 표시된대로 로컬을 클릭하고 "… / binaries / org.drools.updatesite"를 선택합니다.
Drools 및 jBPM을 선택하고 다음을 클릭하십시오.
다시 다음을 클릭합니다. 그런 다음 약관 및 라이센스 계약에 동의하고 마침을 클릭합니다.
마침을 클릭하면 소프트웨어 설치가 시작됩니다.
성공적으로 설치하면 다음과 같은 대화 상자가 나타납니다.
예를 클릭하십시오. Eclipse가 다시 시작되면 Windows → 환경 설정으로 이동하십시오.
기본 설정에서 Drools를 볼 수 있습니다. 이제 Drools 플러그인 설치가 완료되었습니다.
Drools Runtime은 특정 버전의 Drools jar로 프로그램을 실행하도록 편집기에 지시하는 데 필요합니다. 다른 Drools Runtime으로 프로그램 / 애플리케이션을 실행할 수 있습니다.
Windows → 기본 설정 → Drools → 설치된 Drools Runtime을 클릭합니다. 그런 다음 다음 스크린 샷에 표시된대로 추가를 클릭합니다.
그런 다음 여기에 표시된대로 새 Drools 런타임 만들기를 클릭합니다.
droolsjbpm-tools-distribution-5.3.0.Final.zip 을 다운로드 한 바이너리 폴더까지의 경로를 입력합니다.
확인을 클릭하고 Drools 런타임의 이름을 제공하십시오. 이제 Drools 런타임이 생성되었습니다.
기본 Drools 프로그램을 만들려면 Eclipse를 엽니 다. Fileb → New → Project로 이동합니다.
Drools Project를 선택합니다. 프로젝트에 적합한 이름을 지정하십시오. 예를 들어 DroolsTest입니다.
다음 화면은 첫 번째 Drools 프로젝트에서 원하는 파일을 선택하라는 메시지를 표시합니다.
처음 두 파일을 선택하십시오. 첫 번째 파일은 .drl 파일 (Drools 규칙 파일)이고 두 번째 파일은 HelloWorld 규칙을로드하고 실행하기위한 Java 클래스입니다.
다음 → 마침을 클릭합니다.
마침을 클릭하면 작업 공간에 <DroolsTest> 프로젝트가 생성됩니다. Java 클래스를 연 다음 마우스 오른쪽 단추를 클릭하고 Java 응용 프로그램으로 실행합니다. 여기에 표시된대로 출력이 표시됩니다.
다음으로 규칙 엔진에서 자주 사용되는 용어에 대해 설명합니다.
규칙
조건을 지정하는 규칙 엔진의 핵심입니다 ( 'a'가 'b'인 경우).
사리
사실은 규칙이 적용되는 데이터입니다. Java 관점에서 팩트는 POJO (Plain Old Java Object)입니다.
세션
Drools의 지식 세션은 규칙을 실행하는 핵심 구성 요소입니다. 모든 규칙과 기타 리소스를 보유한 지식 세션입니다. KnowledgeBase에서 Knowledge Session이 생성됩니다.
규칙 엔진이 작동하려면 팩트가 세션에 삽입되고 조건이 충족되면 후속 규칙이 실행됩니다. 세션은 두 가지 유형이 있습니다.
- Stateless 지식 세션
- 상태 저장 지식 세션
의제
논리적 개념입니다. 의제는 활성화가 실행되기를 기다리는 논리적 장소입니다.
활성화
활성화는 then규칙의 일부. 활성화는 적절한 규칙이 실행되는 의제에 배치됩니다.
Hello World 프로젝트 (Sample.drl)에 작성된 기본 규칙이 보이면 지금 설명 할 키워드가 많이 사용됩니다.
Sample.drl
Package− 모든 규칙은 패키지 이름으로 시작합니다. 패키지는 규칙의 네임 스페이스 역할을합니다. 패키지 내의 규칙 이름은 고유해야합니다. 규칙의 패키지는 Java의 패키지와 유사합니다.
Import statement− 규칙을 적용하려는 사실이 무엇이든 해당 사실을 가져와야합니다. 예를 들어, com.sample.DroolsTest.Message; 위의 예에서.
Rule Definition− 규칙 이름, 조건 및 결과로 구성됩니다. Drools 키워드는rule, when, then, 과 end. 위의 예에서 규칙 이름은 "Hello World"및 "GoodBye"입니다. 그만큼when 부분은 규칙과 then부분은 결과입니다. 규칙 용어에서when 부분은 LHS (왼쪽)라고도하며 then 규칙의 RHS (오른쪽)로 일부.
이제 Drools를로드하고 규칙을 실행하는 데 사용되는 Java 파일에서 사용되는 용어를 살펴 보겠습니다.
지식베이스
지식 기반은 규칙, 프로세스 및 내부 유형 모음을 관리하는 인터페이스입니다. 패키지 내부에 포함되어 있습니다.org.drools.KnowledgeBase. Drools에서 이들은 일반적으로knowledge definitions 또는 knowledge. 지식 정의는 다음으로 그룹화됩니다.knowledge packages. 지식 정의를 추가하거나 제거 할 수 있습니다. Knowledge Base의 주요 목적은 제작 비용이 많이 들기 때문에 저장하고 재사용하는 것입니다. 지식베이스는 지식 세션을 생성하는 방법을 제공합니다.
지식 세션
지식 세션은 지식 기반에서 검색됩니다. Drools Engine과 상호 작용하기위한 기본 인터페이스입니다. 지식 세션은 두 가지 유형이 있습니다.
Stateless 지식 세션
상태 저장 지식 세션
Stateless 지식 세션
Stateless Knowledge Session은 추론을 사용하지 않고 가장 간단한 사용 사례를 구성하는 상태 비 저장 세션입니다. 상태 비 저장 세션은 함수처럼 호출되어 일부 데이터를 전달한 다음 일부 결과를 다시받을 수 있습니다. 상태 비 저장 세션의 일반적인 예는 다음과 같습니다.
Validation
이 사람은 모기지 자격이 있습니까?
Calculation
모기지 프리미엄을 계산합니다.
Routing and Filtering
이메일과 같은 수신 메시지를 폴더로 필터링합니다.
수신 메시지를 목적지로 보내기
상태 저장 지식 세션
Stateful 세션은 더 오래 유지되며 시간이 지남에 따라 반복적 인 변경이 가능합니다. 상태 저장 세션의 일반적인 사용 사례는 다음과 같습니다.
Monitoring
반자동 구매를위한 주식 시장 모니터링 및 분석.
Diagnostics
결함 발견, 의료 진단
Logistics
소포 추적 및 배송 프로비저닝
지식 빌더
KnoledgeBuilder 인터페이스는 지식 정의 (규칙, 프로세스, 유형)에서 KnowledgePackage를 빌드하는 역할을합니다. 패키지 내부에 포함되어 있습니다.org.drools.builder.KnowledgeBuilder. 지식 정의는 다양한 형식이 될 수 있습니다. 빌드에 문제가있는 경우 KnowledgeBuilder는 다음 두 가지 방법을 통해 오류를보고합니다.hasErrors 과 getError.
다음 다이어그램은 프로세스를 설명합니다.
위의 예에서는 상태 비 저장 지식 세션의 간단한 예를 들어 세션에 사실을 삽입 한 다음 fireAllRules () 메서드가 호출되고 출력이 표시됩니다.
상태 저장 지식 세션의 경우 규칙이 실행되면 상태 저장 지식 세션 객체가 메소드를 호출해야합니다. dispose() 세션을 해제하고 메모리 누수를 방지합니다.
.drl (규칙 파일)에는 자체 구문이 있으므로이 장에서 규칙 구문의 일부를 다루겠습니다.
규칙의 조건
규칙은 다음과 같은 많은 조건과 패턴을 포함 할 수 있습니다.
- 계정 (잔액 == 200)
- 고객 (이름 ==“Vivek”)
위의 조건은 계정 잔액이 200인지 또는 고객 이름이 "Vivek"인지 확인합니다.
규칙의 변수
Drools의 변수 이름은 달러 ($) 기호로 시작합니다.
- $ account − 계정 ()
- $ account는 Account () 클래스의 변수입니다.
Drools는 모든 기본 Java 유형 및 심지어 Enum과 함께 작동 할 수 있습니다.
규칙의 주석
특수 문자 인 # 또는 //를 사용하여 한 줄 주석을 표시 할 수 있습니다.
여러 줄 주석의 경우 다음 형식을 사용하십시오.
/*
Another line
.........
.........
*/
글로벌 변수
전역 변수는 세션에 할당 된 변수입니다. 다음과 같은 다양한 이유로 사용할 수 있습니다.
입력 매개 변수의 경우 (예 : 세션간에 사용자 정의 할 수있는 상수 값).
출력 매개 변수의 경우 (예 :보고-규칙이 전역 보고서 변수에 일부 메시지를 쓸 수 있음)
규칙 내에서 사용할 수있는 로깅과 같은 서비스의 진입 점입니다.
규칙의 기능
기능은 편의 기능입니다. 그들은 조건과 결과에 사용될 수 있습니다. 함수는 유틸리티 / 도우미 클래스의 대안을 나타냅니다. 예를 들면
function double calculateSquare (double value) {
return value * value;
}
방언
방언은 조건 또는 결과에있는 모든 코드 식에 사용되는 구문을 지정합니다. 여기에는 반환 값, 평가, 인라인 평가, 술어, 두드러진 표현, 결과 등이 포함됩니다. 기본값은Java. Drools는 현재MVEL. 기본 언어는 다음과 같이 패키지 수준에서 지정할 수 있습니다.
package org.mycompany.somePackage
dialect "mvel"
MVEL 방언
MVEL은 Java 기반 애플리케이션을위한 표현 언어입니다. 필드 및 방법 / 게터 액세스를 지원합니다. Java 구문을 기반으로합니다.
돌출
Salience는 Rule Syntax의 매우 중요한 기능입니다. Salience는 충돌 해결 전략에서 먼저 실행할 규칙을 결정하는 데 사용됩니다. 기본적으로 기본 기준입니다.
salience를 사용하여 실행 규칙의 순서를 정의 할 수 있습니다. Salience에는 int 유형의 숫자를 반환하는 모든 표현식을 사용하는 하나의 속성이 있습니다 (음수뿐 아니라 양수도 유효 함). 값이 높을수록 충돌 해결 전략에서 규칙이 실행될 가능성이 높아집니다.
salience ($account.balance * 5)
기본 salience 값은 0입니다. salience 값을 일부 규칙에만 할당 할 때이를 염두에 두어야합니다.
규칙 구문에는 다른 많은 기능 / 매개 변수가 있지만 여기서는 중요한 기능 만 다루었습니다.
규칙 결과 키워드
규칙 결과 키워드는 "then”규칙의 일부입니다.
Modify − 사실의 속성은 then 규칙의 일부.
Insert − 일부 조건에 따라 참이면 규칙 엔진의 현재 세션에 새로운 사실을 삽입 할 수 있습니다.
Retract − 규칙에서 특정 조건이 참이고 해당 사실에 대해 다른 조치를 취하지 않으려는 경우 규칙 엔진에서 특정 사실을 철회 할 수 있습니다.
Note− 규칙 결과 내에 조건부 논리 (if 문)를 사용하는 것은 매우 나쁜 습관으로 간주됩니다. 대부분의 경우 새 규칙을 만들어야합니다.
이 장에서는 다음 문제 설명에 대한 Drools 프로젝트를 생성합니다.
도시와 상품의 종류 (도시와 상품의 조합)에 따라 해당 도시와 관련된 지방세를 찾으십시오.
Drools 프로젝트를위한 두 개의 DRL 파일이 있습니다. 두 개의 DRL 파일은 고려중인 두 도시 (Pune 및 Nagpur)와 네 가지 유형의 제품 (식료품, 의약품, 시계 및 명품)을 나타냅니다.
두 도시의 의약품에 대한 세금은 0으로 간주됩니다.
식료품의 경우 Pune에서는 Rs 2, Nagpur에서는 Rs 1의 세금을 부과했습니다.
우리는 다른 산출물을 보여주기 위해 동일한 판매 가격을 사용했습니다. 모든 규칙이 응용 프로그램에서 실행되고 있습니다.
다음은 각 itemType을 보유하는 모델입니다.
package com.sample;
import java.math.BigDecimal;
public class ItemCity {
public enum City {
PUNE, NAGPUR
}
public enum Type {
GROCERIES, MEDICINES, WATCHES, LUXURYGOODS
}
private City purchaseCity;
private BigDecimal sellPrice;
private Type typeofItem;
private BigDecimal localTax;
public City getPurchaseCity() {
return purchaseCity;
}
public void setPurchaseCity(City purchaseCity) {
this.purchaseCity = purchaseCity;
}
public BigDecimal getSellPrice() {
return sellPrice;
}
public void setSellPrice(BigDecimal sellPrice) {
this.sellPrice = sellPrice;
}
public Type getTypeofItem() {
return typeofItem;
}
public void setTypeofItem(Type typeofItem) {
this.typeofItem = typeofItem;
}
public BigDecimal getLocalTax() {
return localTax;
}
public void setLocalTax(BigDecimal localTax) {
this.localTax = localTax;
}
}
DRL 파일
앞서 제안했듯이 여기에서는 Pune.drl과 Nagpur.drl이라는 두 개의 DRL 파일을 사용했습니다.
Pune.drl
푸네시의 규칙을 실행하는 DRL 파일입니다.
// created on: Dec 24, 2014
package droolsexample
// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;
// declare any global variables here
dialect "java"
rule "Pune Medicine Item"
when
item : ItemCity (purchaseCity == ItemCity.City.PUNE,
typeofItem == ItemCity.Type.MEDICINES)
then
BigDecimal tax = new BigDecimal(0.0);
item.setLocalTax(tax.multiply(item.getSellPrice()));
end
rule "Pune Groceries Item"
when
item : ItemCity(purchaseCity == ItemCity.City.PUNE,
typeofItem == ItemCity.Type.GROCERIES)
then
BigDecimal tax = new BigDecimal(2.0);
item.setLocalTax(tax.multiply(item.getSellPrice()));
end
Nagpur.drl
Nagpur 도시에 대한 규칙을 실행하는 DRL 파일입니다.
// created on: Dec 26, 2014
package droolsexample
// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;
// declare any global variables here
dialect "java"
rule "Nagpur Medicine Item"
when
item : ItemCity(purchaseCity == ItemCity.City.NAGPUR,
typeofItem == ItemCity.Type.MEDICINES)
then
BigDecimal tax = new BigDecimal(0.0);
item.setLocalTax(tax.multiply(item.getSellPrice()));
end
rule "Nagpur Groceries Item"
when
item : ItemCity(purchaseCity == ItemCity.City.NAGPUR,
typeofItem == ItemCity.Type.GROCERIES)
then
BigDecimal tax = new BigDecimal(1.0);
item.setLocalTax(tax.multiply(item.getSellPrice()));
end
새로운 도시가 추가되는 경우 나중에 규칙 파일을 얼마든지 추가 할 수있는 확장 성을 제공하므로 도시를 기반으로 DRL 파일을 작성했습니다.
모든 규칙이 규칙 파일에서 실행되고 있음을 보여주기 위해 두 가지 항목 유형 (약과 식료품)을 사용했습니다. 의약품은 면세되며 식료품은 도시별로 세금이 부과됩니다.
테스트 클래스는 규칙 파일을로드하고, 사실을 세션에 삽입하고, 출력을 생성합니다.
Droolstest.java
package com.sample;
import java.math.BigDecimal;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import com.sample.ItemCity.City;
import com.sample.ItemCity.Type;
/*
*This is a sample class to launch a rule.
*/
public class DroolsTest {
public static final void main(String[] args) {
try {
// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
ItemCity item1 = new ItemCity();
item1.setPurchaseCity(City.PUNE);
item1.setTypeofItem(Type.MEDICINES);
item1.setSellPrice(new BigDecimal(10));
ksession.insert(item1);
ItemCity item2 = new ItemCity();
item2.setPurchaseCity(City.PUNE);
item2.setTypeofItem(Type.GROCERIES);
item2.setSellPrice(new BigDecimal(10));
ksession.insert(item2);
ItemCity item3 = new ItemCity();
item3.setPurchaseCity(City.NAGPUR);
item3.setTypeofItem(Type.MEDICINES);
item3.setSellPrice(new BigDecimal(10));
ksession.insert(item3);
ItemCity item4 = new ItemCity();
item4.setPurchaseCity(City.NAGPUR);
item4.setTypeofItem(Type.GROCERIES);
item4.setSellPrice(new BigDecimal(10));
ksession.insert(item4);
ksession.fireAllRules();
System.out.println(item1.getPurchaseCity().toString() + " "
+ item1.getLocalTax().intValue());
System.out.println(item2.getPurchaseCity().toString() + " "
+ item2.getLocalTax().intValue());
System.out.println(item3.getPurchaseCity().toString() + " "
+ item3.getLocalTax().intValue());
System.out.println(item4.getPurchaseCity().toString() + " "
+ item4.getLocalTax().intValue());
} catch (Throwable t) {
t.printStackTrace();
}
}
private static KnowledgeBase readKnowledgeBase() throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("Pune.drl"), ResourceType.DRL);
kbuilder.add(ResourceFactory.newClassPathResource("Nagpur.drl"), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error: errors) {
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}
}
이 프로그램을 실행하면 출력은 다음과 같습니다.
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10
Pune와 Nagpur 모두 품목이 의약품 인 경우 지방세는 0입니다. 품목이 식료품 제품인 경우 세금은 도시별로 부과됩니다. 다른 제품에 대한 DRL 파일에 더 많은 규칙을 추가 할 수 있습니다. 이것은 단지 샘플 프로그램입니다.
DRL 파일에서 외부 함수 호출
여기서는 DRL 파일 내의 Java 파일에서 정적 함수를 호출하는 방법을 보여줍니다.
우선 수업을 만드세요 HelloCity.java 같은 패키지에 com.sample.
package com.sample;
public class HelloCity {
public static void writeHello(String name) {
System.out.println("HELLO " + name + "!!!!!!");
}
}
그런 다음 DRL 파일에 import 문을 추가하여 DRL 파일에서 writeHello 메서드를 호출합니다. 다음 코드 블록에서 DRL 파일 Pune.drl의 변경 사항은 노란색으로 강조 표시됩니다.
// created on: Dec 24, 2014
package droolsexample
// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;
import com.sample.HelloCity;
//declare any global variables here
dialect "java"
rule "Pune Medicine Item"
when
item : ItemCity(purchaseCity == ItemCity.City.PUNE,
typeofItem == ItemCity.Type.MEDICINES)
then
BigDecimal tax = new BigDecimal(0.0);
item.setLocalTax(tax.multiply(item.getSellPrice()));
HelloCity.writeHello(item.getPurchaseCity().toString());
end
rule "Pune Groceries Item"
when
item : ItemCity(purchaseCity == ItemCity.City.PUNE,
typeofItem == ItemCity.Type.GROCERIES)
then
BigDecimal tax = new BigDecimal(2.0);
item.setLocalTax(tax.multiply(item.getSellPrice()));
end
프로그램을 다시 실행하면 출력은 다음과 같습니다.
HELLO PUNE!!!!!!
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10
이제 출력의 차이점은 Java 클래스의 정적 메소드 출력을 보여주는 노란색으로 표시됩니다.
Java 메소드를 호출하는 이점은 Java로 모든 유틸리티 / 도우미 함수를 작성하고 DRL 파일에서 동일한 함수를 호출 할 수 있다는 것입니다.
Drools 프로젝트를 디버깅하는 방법에는 여러 가지가 있습니다. 여기에서는 어떤 규칙이 트리거되거나 실행되는지 알려주는 유틸리티 클래스를 작성합니다.
이 접근 방식을 사용하면 Drools 프로젝트에서 트리거되는 모든 규칙을 확인할 수 있습니다. 다음은 유틸리티 클래스입니다.
Utility.java
package com.sample;
import org.drools.spi.KnowledgeHelper;
public class Utility {
public static void help(final KnowledgeHelper drools, final String message){
System.out.println(message);
System.out.println("\nrule triggered: " + drools.getRule().getName());
}
public static void helper(final KnowledgeHelper drools){
System.out.println("\nrule triggered: " + drools.getRule().getName());
}
}
첫 번째 방법 help DRL 파일을 통해 String으로 전달할 수있는 추가 정보와 함께 트리거 된 규칙을 인쇄합니다.
두 번째 규칙 helper 특정 규칙이 트리거되었는지 여부를 인쇄합니다.
각 DRL 파일에 유틸리티 메소드 중 하나를 추가했습니다. 또한 DRL 파일 (Pune.drl)에 가져 오기 기능을 추가했습니다. 에서then규칙의 일부로 유틸리티 함수 호출을 추가했습니다. 수정 된 Pune.drl은 다음과 같습니다. 변경 사항은 파란색으로 강조 표시됩니다.
수정 된 Pune.drl
//created on: Dec 24, 2014
package droolsexample
//list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;
import com.sample.HelloCity;
import function com.sample.Utility.helper;
// declare any global variables here
dialect "java"
rule "Pune Medicine Item"
when
item : ItemCity(purchaseCity == ItemCity.City.PUNE,
typeofItem == ItemCity.Type.MEDICINES)
then
BigDecimal tax = new BigDecimal(0.0);
item.setLocalTax(tax.multiply(item.getSellPrice()));
HelloCity.writeHello(item.getPurchaseCity().toString());
helper(drools);
end
rule "Pune Groceries Item"
when
item : ItemCity(purchaseCity == ItemCity.City.PUNE,
typeofItem == ItemCity.Type.GROCERIES)
then
BigDecimal tax = new BigDecimal(2.0);
item.setLocalTax(tax.multiply(item.getSellPrice()));
helper(drools);
end
마찬가지로 두 번째 DRL 파일 (Nagpur.drl)에 다른 유틸리티 기능을 추가했습니다. 다음은 수정 된 코드입니다.
수정 된 Nagpur.drl
// created on: Dec 26, 2014
package droolsexample
// list any import classes here.
import com.sample.ItemCity;
import java.math.BigDecimal;
import function com.sample.Utility.help;
//declare any global variables here
dialect "java"
rule "Nagpur Medicine Item"
when
item : ItemCity(purchaseCity == ItemCity.City.NAGPUR,
typeofItem == ItemCity.Type.MEDICINES)
then
BigDecimal tax = new BigDecimal(0.0);
item.setLocalTax(tax.multiply(item.getSellPrice()));
help(drools,"added info");
end
rule "Nagpur Groceries Item"
when
item : ItemCity(purchaseCity == ItemCity.City.NAGPUR,
typeofItem == ItemCity.Type.GROCERIES)
then
BigDecimal tax = new BigDecimal(1.0);
item.setLocalTax(tax.multiply(item.getSellPrice()));
help(drools,"info");
end
프로그램을 다시 실행하면 다음 출력이 생성됩니다.
info
rule triggered: Nagpur Groceries Item
added info
rule triggered: Nagpur Medicine Item
rule triggered: Pune Groceries Item
HELLO PUNE!!!!!!
rule triggered: Pune Medicine Item
PUNE 0
PUNE 20
NAGPUR 0
NAGPUR 10
두 유틸리티 함수가 모두 호출되고 특정 규칙이 호출되었는지 여부를 보여줍니다. 위의 예에서는 모든 규칙이 호출되지만 엔터프라이즈 응용 프로그램에서이 유틸리티 함수는 디버그하고 특정 규칙이 실행되었는지 여부를 확인하는 데 정말 유용 할 수 있습니다.
Eclipse에서 Debug Perspective 사용
Drools 애플리케이션을 실행하는 동안 규칙을 디버깅 할 수 있습니다. 규칙 결과에 중단 점을 추가 할 수 있으며 규칙 실행 중에 이러한 중단 점이 발생할 때마다 실행이 일시적으로 중지됩니다. 그런 다음 Java 애플리케이션에서 수행하는 것처럼 해당 시점에 알려진 변수를 검사하고 Eclipse에서 사용 가능한 일반 디버깅 옵션을 사용할 수 있습니다.
DRL 파일에 중단 점을 만들려면 중단 점을 만들 줄을 두 번 클릭하면됩니다. 중단 점은then규칙의 일부입니다. 중단 점은 DRL 편집기에서 중단 점을 두 번 클릭하여 제거 할 수 있습니다.
중단 점을 적용한 후 응용 프로그램을 Drools 응용 프로그램으로 디버깅해야합니다. Drools 중단 점 (DRL 파일의 중단 점)은 응용 프로그램이 Drools 응용 프로그램으로 디버깅되는 경우에만 작동합니다. 다음은 동일한 작업을 수행하는 방법입니다.
응용 프로그램을 Drools 응용 프로그램으로 디버그하면 다음 스크린 샷과 같이 DRL 파일에 대한 컨트롤이 표시됩니다.
해당 디버그 지점에서 개체의 변수와 현재 값을 볼 수 있습니다. 다음 줄로 이동하는 F6과 다음 디버그 지점으로 이동하는 F8의 동일한 제어가 여기에서도 적용됩니다. 이러한 방식으로 Drools 애플리케이션을 디버그 할 수 있습니다.
Note − Drools 애플리케이션의 디버그 퍼스펙티브는 Drools 5.x까지 방언이 MVEL 인 경우에만 작동합니다.