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"
        xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="
http://www.springframework.org/schema/aop"
        xmlns:tx="
http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <bean id="ruleServiceProvider"
          class="org.springmodules.jsr94.factory.DefaultRuleServiceProviderFactoryBean">
      <property name="provider"><value>
http://www.oracle.com/</value></property>
      <property name="providerClass">
        <value>oracle.rules.jsr94.RLRuleServiceProvider</value>
      </property>
    </bean>

    <bean id="ruleRuntime"
          class="org.springmodules.jsr94.factory.RuleRuntimeFactoryBean">
      <property name="serviceProvider"><ref local="ruleServiceProvider"/></property>
    </bean>

    <bean id="ruleAdministrator"
          class="org.springmodules.jsr94.factory.RuleAdministratorFactoryBean">
      <property name="serviceProvider"><ref local="ruleServiceProvider"/></property>
    </bean>

    <bean id="ruleSource" class="org.springmodules.jsr94.rulesource.DefaultRuleSource">
      <property name="ruleRuntime"><ref local="ruleRuntime"/></property>
      <property name="ruleAdministrator"><ref local="ruleAdministrator"/></property>
      <property name="source">
       
<value>file:/D:/projekte/prototype/RulesIntegration/src/de/bmaier/rules/test/MyOracleRules.rl</value>
     
</property>
      <property name="bindUri"><value>MyTestOracleRules</value></property>
    </bean>

    <bean id="testRule" class="org.springmodules.jsr94.core.Jsr94Template">
      <property name="ruleSource"><ref local="ruleSource"/>
      </property>
    </bean>

</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 = &quot;Rental declined &quot;;

                   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( &quot;Rental decision is &quot; + decision.type +
                                  &quot; for driver &quot; + decision.driverName +
                                  &quot; for reason &quot; + 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 &amp;&amp;
                            (v0_Driver.age &lt; 19))) {
                                DM.println( &quot;Rental declined: &quot; + v0_Driver.name +
                                &quot; under age, age is: &quot; + v0_Driver.age);
                                retract(v0_Driver);
                        }
                    }
                    rule DriverAge {
                        priority = 0;
                        if ((fact de.arbeitsagentur.robaso.rules.test.Driver v0_Driver &amp;&amp;
                            (v0_Driver.age &gt; 18))) {
                                DM.println( &quot;Rental permitted for: &quot; + v0_Driver.name +
                                &quot;, age is: &quot; + 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");
          Jsr94Template rule = (Jsr94Template)ctx.getBean("testRule");

          rule.executeStateless("MyTestOracleRules", Collections.emptyMap(), new StatelessRuleSessionCallback() {
                public Object execute(StatelessRuleSession session) throws InvalidRuleSessionException, RemoteException {
                    List result;
                    List input = new ArrayList();

                    Driver d = new Driver();
                    d.setAge(25);
                    d.setName("Dave");
                    input.add(d);
                    d = new Driver();
                    d.setAge(8);
                    d.setName("John");
                    input.add(d);

                    result = session.executeRules(input);
                    return result;
                }

            });
        }

    … dann noch die Java Klasse Driver, die im Beispiel verwendet wurde:

    package de.bamier.rules.test;

    public class Driver {
        int age = 18;
        String name = "Luis";
        public Driver() {
            super();
        }

        public void setAge(int age) {
            this.age = age;
        }

        public int getAge() {
            return age;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }

 

Und es funktioniert !!!

Advertisements

~ von bmaier - 4. Januar 2011.

Eine Antwort to “JSR 94 mit Oracle Business Rules & Spring Modules”

  1. Für die, die auch die verwendeten Bibliotheken suchen müssen.
    Falls JDeveloper unter D:\Oracle\JDeveloper installiert wurde sind die JARs unter

    D:\Oracle\JDeveloper\jdeveloper\soa\modules\oracle.rules_11.1.1\jsr94_obr.jar
    D:\Oracle\JDeveloper\jdeveloper\soa\modules\oracle.rules_11.1.1\jsr94.jar
    D:\Oracle\JDeveloper\jdeveloper\soa\modules\oracle.rules_11.1.1\rl.jar
    D:\Oracle\JDeveloper\jdeveloper\soa\modules\oracle.rules_11.1.1\rl_dms.jar
    D:\Oracle\JDeveloper\jdeveloper\soa\modules\oracle.rules_11.1.1\rules.jar
    D:\Oracle\JDeveloper\jdeveloper\soa\modules\oracle.rules_11.1.1\rulesdk2.jar
    D:\Oracle\JDeveloper\jdeveloper\modules\oracle.xdk_11.1.0\xmlparserv2.jar

    Dein Beispiel funktioniert gut!

Kommentar verfassen

Bitte logge dich mit einer dieser Methoden ein, um deinen Kommentar zu veröffentlichen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

 
%d Bloggern gefällt das: