JSR 94 mit Oracle Business Rules & Spring Modules
Die Integration der Oracle Rules mit Spring Modules ist leider nicht beschrieben, jedoch durch die Implementierung des JSR 94 möglich.
Folgender funktionsfähiger Testcode möchte ich deshalb mit interessierten teilen (Umsetzungszeit 10 Minuten). Es muss dazu weder die SOA-Suite noch die Oracle Business Rule Engine installiert werden. Eine paar Libraries in Classpath reichen aus, um die Oracle RuleEngine zu nutzen. Zudem ist die Regelsprache intuitiv und kann direkt ohne Konvertierung mit Java-Objekten umgehen.
- Herunterladen des JSR94 Spring Module
- Die mit dem JDeveloper mitgelieferten Oracle Rules Libraries in den Classpath aufnehmen: jsr94_obr.jar, jsr94.jar, rl.jar, rl_dms.jar, rules.jar, rulesdk2.jar, xmlparserv2.jar
- applicationContext.xml laut Muster anlegen:
|
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" <bean id="ruleServiceProvider" <bean id="ruleRuntime" <bean id="ruleAdministrator" <bean id="ruleSource" class="org.springmodules.jsr94.rulesource.DefaultRuleSource"> <bean id="testRule" class="org.springmodules.jsr94.core.Jsr94Template"> </beans> |
- Wichtig sind die Einträge:
- providerClass = oracle.rules.jsr94.RLRuleServiceProvider
- source = Lokation der Regeldatei: (file:/D:/projekte/prototype/RulesIntegration/src/de/bmaier/rules/test/MyOracleRules.rl)
- bindUri = Beliebiger Name, der später aus dem JavaCode bei der Regelausführung referenziert wird (hier MyTestOracleRule)
- Die RegelDatei im XML-Format JSR94 anlegen und darin die Oracle RL definieren (Beispiel Funktioniert mit Oracle Rules 11g):
<rule-execution-set xmlns="http://xmlns.oracle.com/rules/jsr94/configuration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
<name>CarRentalDemo</name>
<description>The Car Rental Demo</description>
<rule-source>
<rl-text>
ruleset DM {final String DeclineMessage = "Rental declined ";
public class Decision supports xpath {
public String driverName;
public String type;
public String message;
}function assertXPath(String package,
java.lang.Object element, String xpath) {
//RL literal statement
main.assertXPath( package, element, xpath );
}function println(String message) {
//RL literal statement
main.println(message);
}function showDecision(DM.Decision decision) {
//RL literal statement
DM.println( "Rental decision is " + decision.type +
" for driver " + decision.driverName +
" for reason " + decision.message);
}
}
</rl-text>
</rule-source>
<rule-source>
<rl-text>
ruleset vehicleRent {
rule UnderAge {
priority = 0;
if ((fact de.arbeitsagentur.robaso.rules.test.Driver v0_Driver &&
(v0_Driver.age < 19))) {
DM.println( "Rental declined: " + v0_Driver.name +
" under age, age is: " + v0_Driver.age);
retract(v0_Driver);
}
}
rule DriverAge {
priority = 0;
if ((fact de.arbeitsagentur.robaso.rules.test.Driver v0_Driver &&
(v0_Driver.age > 18))) {
DM.println( "Rental permitted for: " + v0_Driver.name +
", age is: " + v0_Driver.age);
retract(v0_Driver);
}
}
}
</rl-text>
</rule-source>
<ruleset-stack>
<ruleset-name>vehicleRent</ruleset-name>
</ruleset-stack>
</rule-execution-set>
- Das konfigurierte Springbean “testRule” laden und dann mit den individuellen “Facts” (hier Class Driver) ausführen. Achtung der Name (hier MyTestOracleRules) muss mit dem Attribut bindUri des konfigurierten SpringBean RuleSource im applicationContext.xml übereinstimmen.
|
public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml"); rule.executeStateless("MyTestOracleRules", Collections.emptyMap(), new StatelessRuleSessionCallback() { Driver d = new Driver(); result = session.executeRules(input); }); |
| … dann noch die Java Klasse Driver, die im Beispiel verwendet wurde:
package de.bamier.rules.test; public class Driver { public void setAge(int age) { public int getAge() { public void setName(String name) { public String getName() { |
Und es funktioniert !!!
