Drools-디버깅
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 인 경우에만 작동합니다.