ONJava.com -- The Independent Source for Enterprise Java
oreilly.comSafari Books Online.Conferences.

advertisement

AddThis Social Bookmark Button

Building Enterprise Services with Drools Rule Engine
Pages: 1, 2, 3, 4, 5

Once these rules have been evaluated, an underwriting decision needs to be made based on the outcome. The following rules from the Decision.drl are used:

rule "Underwriting decision"

    when
        $loanApp : (LoanApplication(affordabilityFlag == Flag.NOT_AFFORDABLE) or
        LoanApplication( feedbackMsgSize > 0))
    then
        $loanApp.setStatus(Flag.FAILED);

end

Conflict Resolution

Once all facts are inserted into the working memory, where they may be modified or retracted, the rule engine will find all possible matches for the facts. All candidate rules found during this matching stage are added to the rule engine's agenda. The agenda manages the execution order of these conflicting rules using a conflict resolution strategy. Conflict resolution is required when there are multiple rules on the agenda that are candidates for execution. The rules that are candidates for execution are examined to determine the next set of rule actions to execute based on a predetermined resolution scheme. Since firing a rule may affect the state of the working memory, the rule engine needs to know in what order the rules should fire.

Drools uses different strategies for conflict resolution (please refer to the Drools manual for an in-depth discussion). For this article we use salience, which is the most-used strategy. For this strategy, the rule author specifies that a particular rule has a higher priority (the higher salience rule) than the other matching rules. The highest priority rule is picked from all the matching rules.

When writing and authoring rules, one shouldn't make an assumption that the rules will fire in any particular order or follow some sort of flow. This minimizes the need to resort to any of the conflict resolution strategies described above.

Let's illustrate how conflict resolution is applied to the affordability assessment example described earlier:

    rule "Income multiples"
        salience -3
        when
            Borrower( $grossIncome : grossIncome )
                Property( value > (new Double($grossIncome.doubleValue()*3)))
                $loanApp : LoanApplication()
        then
            $loanApp.setAffordabilityFlag(Flag.NOT_AFFORDABLE);
    end

    rule "Affordability Model"
        salience -4
        when
                Borrower( $affordableLoanAmount : affordableLoanAmount )
                Property( value > (new Double($affordableLoanAmount.doubleValue())))
            $loanApp : LoanApplication()
        then
            $loanApp.setAffordabilityFlag(Flag.NOT_AFFORDABLE);
    end

To make an affordability assessment, lenders can apply either the income multiples rule or use the affordability model rule. The application of the affordability model rule may result in a value that exceeds the value obtained from the income multiple rule. When this happens, lenders usually will disregard the affordability model rule and make their final affordability assessment from the income multiple rule. This is accomplished in Drools by giving the income multiple rule a higher salience value.

Testing the Mortgage Underwriting Example

The example was tested using JBoss Drools 3.0.4 and JDK 1.5. A run of the JUnit test displays the following results:

Testing successful application
=============================
Feedback message size=0
Affordability Flag=AFFORDABLE
Underwriting Decision=PASSED


Testing all feedback messages
=============================
Property should be built after 1965
Type of property should be Owner Occupied
Credit score should be greater than 600
Borrower minimum age should be 18
Loan to value ratio should not be greater than 80
Loan Amount should be between $100,000 and $400,000

Feedback message size=6
Affordability Flag=NOT_AFFORDABLE
Underwriting Decision=FAILED

A feedback report can be created out of this data and displayed to the lender for further analysis.

Conclusion

In this article, I have shown how the Drools rule engine can be used to abstract complex business rules in a service that can be part of a larger enterprise service framework. A service that automates mortgage underwriting decisions was used as a case study; the patterns used to implement this service using Drools can be applied to many other problem domains that are well-suited to a rules-based approach. The article highlights through a real-world example important features of the Drools rule engine: externalization of rapidly changing business policies using rule-based programming, runtime evaluation of rules, and conflict resolution. The article did not cover deployment considerations or change-management issues.

Resources

Birali Hakizumwami is currently working as an application architect.


Return to ONJava.com.