Die Ursache für die Erweiterung des Domänenmodells der HTI ist das Hinzukommen einer Monitoring-Komponente. Diese sollte dazu dienen, dass sog. Service-Level-Agreements (SLA) eingehalten werden können. Sie hat also eine Überwachungs- und Steuerungsfunktion. Als geeignete Technologie für die zu realisierenden Funktionen wurde die Rule-Engine Drools ausgewählt. Um dieses regelbasierte System in die HTI zu integrieren bedarf es zunächst einer Erweiterung des Modells um Datenstrukturen für SLAs und Regeln. Zwar wurde sich bereits in einer Bachelorarbeit mit der notwendigen Erweiterung befasst. Diese Arbeit richtete den Fokus jedoch mehr auf die allgemeine Machbarkeit und hatte einen eher theoretischen Charakter. Nun da es wieder in die Praxisphase geht, treten weitere Probleme und Gedanken zu dem Thema auf. Darum soll es im Folgenden gehen.
Regeln und umgebende Entitäten
Drools-Regeln sind nichts anderes als Teile von XML-Regel-Dokumenten. Diese bestehen aus einem Dokumentelement und einer Dokumententität. Der eigentliche Inhalt eines XML-Dokuments ist in Form der Kinderelemente dem Dokumentelement angehangen.
Die eigentliche Regel ist also ein Kind des Dokumentelementes <package/>.
Vom XML-Dokument zur Java-Klasse
Für die Erweiterung des bisherigen Domänenmodells ist nun von Bedeutung, in wie weit man die Teile der XML-Regeln in Java-Klassen abbilden möchte. Da die Beschreibung des Domänenmodells, also der Java-Klassen für die HTI in XML-Schemas erfolgt, ist es ein leichtes den gesamten Sprachumfang von Drools-XML-Regeln zu unterstützen. Es ist jedoch fraglich, ob die aus dem XML-Schema generierten Java-Klassen tatsächlich benötigt werden. Unnötige Komplexität soll vermieden werden.
Darum muss die Frage gestellt werden, welche Sprachmerkmale der XML-Regeldokumente werden gebraucht und wie werden diese am sinnvollsten im Domänenmodell abgebildet. Es gibt folgende Ansätze der Abbildung:
1 | Einbinden des
Drools-Schemas in das Modellschema | · Der komplette Sprachumfang wird unterstützt. · Es wird jedoch nicht alles gebraucht · Das Modell wird unnötig komplex. |
2 | Erweiterung des
Modellschemas um die notwendigen Sprachelemente der XML-Regelsprache | · Das Modell bleibt überschaubar. · Zusätzliche Erweiterungen bedeuten eine Anpassung des Systems. · Es muss genau herausgestellt werden auf welche Sprachelemente verzichtet werden kann, und auf welche nicht. · Werden Regeln in separaten Objekten gehalten, spielt beim Laden der Regeln die Reihenfolge eine besonders bedeutende Rolle. Dies ist bei der Wahl des Container-datentyps (List/Map/Set) für Regeln und bei der Implementierung des Ladevorgangs zu berücksichtigen. |
3 | Speicherung des XML-Regel-Dokuments als String | · Die Veränderungen am Modell sind dafür minimal. · unnötige Redundanz |
Resultat der Auswertung: Ziel der Konfiguration des Monitorings mit Hilfe von Regeln war es, für jede Task-Instanz eine spezielle Regel angeben zu können. Dies wird dadurch erreicht, dass eine Regel mit Patterns genau beschreibt, welche Task-Instanz eine Regel erfüllen soll. Da alle Regeln bei der Initiierung des Monitoring-Prozesses komplett in den Production-Memory der Rule-Engine geladen werden müssen, sind Redundanzen unerwünscht. Das heißt es wird der Ansatz Nr. 2 verfolgt.
Beziehung der Java-Regelklasse(n) zum Service-Level-Agreement
Ein Service-Level-Agreement muss eingehalten in allen Fällen eingehalten werden. Der Kontrollmechanismus wird durch Regeln umgesetzt. Es ist möglich, dass ein SLA eine Beziehung zu mehreren Regeln besitzt, wobei es auch andere SLAs geben kann, die eine Beziehung zu denselben Regeln besitzen. Es besteht also eine Viele-Zu-Viele-Beziehung. Aufgelöst wird diese Beziehung durch sog. Wrapper-Klassen, die auf Grund der Modellierung per XML notwendig sind, um eine saubere XML-Datenstruktur zu beschreiben. Es gibt also eine Klasse ServiceLevelAgreements, die eine Liste von Objekten der Klasse ServiceLevelAgreement enthält. Analog zu dieser Modellierung mit Wrapper-Klassen, wird dies auf die Klassen Rules und Rule zu. Ein Objekt der Klasse ServiceLevelAgreement hält nun eine Referenz auf ein Rules-Objekt. Weiterhin werden die Beziehungen der Klassen durch folgendes gekennzeichnet. Da SLAs Kundenspezifisch sind, muss für einen neunen Kunden auch eine neues SLA angelegt werden. Auf Grund dieser Spezifik, sind SLAs für andere Kunden nicht zu gebrauchen. Daher besteht zwischen ServiceLevelAgreements und ServiceLevelAgreement eine Kompositionsbeziehung. Da es weiterhin mehrere SLAs geben kann, die einen Regelsatz (Rules) unabhängig voneinander verwenden können, besteht zwischen ServiceLevelAgreement und Rules lediglich eine Aggregationsbeziehung. Weil Regeln zu verschiedenen Regelsätzen orchestriert werden können, muss auch zwischen der Wrapperklasse Rules und der Klasse Rule eine Aggregationsbeziehung bestehen.
Persistenz und Kaskadierung
Es wurde bereits festgestellt, dass Redundanz von Regeln vermieden werden soll, wobei dies zum einen durch das Datenmodell für die Regeln gewährleistet wird. Zum anderen jedoch, ist durch die im vorherigen Abschnitt beschriebene Beziehung sichergestellt, dass mehrere SLAs dieselbe Regel verwenden können. Bei der Realisierung der Persistenz-Mechanismen muss indes dafür Sorge getragen werden, dass unerwünschte Seiteneffekte vermieden werden. Ein kurzes Beispiel erklärt das Problem:
Es gibt zwei SLAs. Beide haben eine Referenz auf dieselben Regeln gespeichert. Verändert ein SLA, als Beziehungsbesitzer der Regeln, beliebige Attribute von diesen oder löscht gar eine Regel, wird das andere von den beiden SLAs von diesen Änderungen auch betroffen sein, ohne, dass dies gewollt war.
Mögliche Manipulationen an den Regeln betreffen daher immer alle SLAs, die gemeinsame Regelreferenzen besitzen. Daher muss man bei der Regelmanipulation Vorsicht walten lassen. Konkrete Vorsichtsmaßnahmen sollten sein:
- Das Weiterreichen (Kaskadierung) von Persistenz-Operationen von SLA zu Regel muss eingeschränkt werden. Ähnlich wie bei der Beziehung zwischen Task-Instanz und Task-Beschreibung, soll zwar eine Referenz auf das Objekt existieren. Etwaige Manipulationen beim Speichervorgang sollen jedoch nicht weitergerecht werden.
- Da die Kaskadierung eingeschränkt wird, muss es eine eigene Persistenz-Klasse geben, die alle Operationen separat ermöglicht. Es wird also ein Rule-DAO (Data Access Object) benötigt. Diese muss bei der Realisierung von Manipulationsmechanismen unterscheiden, ob diese für ein referenzierendes SLA oder für alle gelten soll.
Damit wird bei der Umsetzung der Persistenz-Schicht bereits ersichtlich, dass es Beschränkungen für die Manipulation von Regeln bzw. Service-Level-Agreements gibt.
Zusammensetzen und Validieren vom Regeldokumenten
Soll aus einem Java-Regelobjekt eine Regel in die Rule-Engine eingefügt werden, so muss die Form der Regel der XML-Regelform entsprechen. Das heißt, das Dokument muss aus den entsprechenden Teilen, die als Java-Objekte gespeichert sind, zu einem validen XML-Regeldokument zusammengesetzt werden. Es ist sinnvoll, dieses Zusammensetzen zu kapseln. Die Kapselung soll durch die Klasse RuleDocumentBuilder geschehen. Diese bekommt die „Einzelteile“ der Regeln als Klassenfelder gesetzt. Daraus soll das vollständige XML-Dokument generiert werden.
Ein valides XML-Regel-Dokument allein ist jedoch noch kein Erfolgsgarant für die Ausführung der Regeln. Können bspw. Java-Abhängigkeiten nicht aufgelöst werden, wird der Package-Builder von Drools die Ausführung verhindern. Daher wird neben dem Zusammensetzen eines validen Dokumentes auch noch eine Funktion benötigt, die das Dokument bzw. den enthaltenen Java-Code validiert. Dazu kann man sich bequemerweise ebenfalls des Package-Builders bedienen.
Resultierendes Domänenmodell
Das vorläufig erweiterte Domänenmodell ist in dem folgend abgebildeten Klassendiagramm zu sehen. Die dargestellten Klassen beschränken sich nur auf die wesentlichen, unmittelbar von Änderungen betroffenen Klassen. Blau sind alle neuen Klassen dargestellt, rot die bereits bestehenden Klassen.
|
Erweitertes Domänenmodell |
Neben den bisher beschriebenen Erweiterungen bleibt zu erwähnen, dass das ehemals in der Task-Beschreibung befindliche Attribut deadlines nun in der Klasse ServiceLevelAgreement zu finden ist.