Posts mit dem Label BPMN werden angezeigt. Alle Posts anzeigen
Posts mit dem Label BPMN werden angezeigt. Alle Posts anzeigen

Freitag, 19. Dezember 2014

Oracle Business Rules: Verbal Rules und BPM handson

Oracle hat mit SOA/BPM 12c die Oracle Business Rules um die sog. Verbal Rules erweitert. Damit ist es möglich, Regeln umgangsprachlicher zu formulieren um Fachanwender besser in das Regeldesign einzubinden. Dieses Tutorial zeigt den Umgang mit Verbal Rules, die grundsätzliche Bedienung der BPM-Suite sollte hierfür bekannt sein.


Los geht es im JDeveloper mit einer neuen BPM Application. Diese sollte gleich ein Projekt mit einem leeren BPM Process bekommen.


Wenn der Prozess geöffnet ist, lässt sich der Busisness Catalog anzeigen (Window|Catalog). Per Rechtsklick|New|Module wird zunächst ein neues Modul erstellt.


Auf dem Modul wird dann per Rechtsklick|New|Business Object das erste BO erstellt. 

Namen vergeben und fertig.


Es bekommt zwei Attribute (price:decimal, discount:int).


Ein zweite BO namens ApprovalOutBO wird angelegt, mit einem einzigen Attribut approval (String).


Zu den Business Objects werden jetzt entsprechende Process Data Objects benötigt. Erzeugt werden diese in der Structure-Darstellung via Rechtsklick|New.

Ein sinnvoller Name sollte vergeben werden, der Typ wird ausgewählt via Browse.


Hier dann das jeweils passende BO auswählen


Das Ganze wird für beide BO's durchgeführt, so dass jetzt zwei entsprechende Process Data Objects angezeigt werden sollten.


In der Prozessdarstellung wird nun eine Rules Task im Prozess platziert.


Auf dem Reiter Implementation wird zunächst per Klick auf das grüne Plus (+) ein neues Ruleset erstellt. Wieder per Klick auf das grüne Plus können die Parameter aus dem Fenster per Drag&Drop zugeordnet werden. Die Richtung wird oben in der Combobox eingestellt. Alle Dialoge werden danach mit OK verlassen.


In der Composite Darstellung ist jetzt auch die neue Rules-Komponente vorhanden. Diese kann per Doppelklick geöffnet werden.


Im Reiter Facts finden sich dann auch die beiden Parameter wieder. In der Spalte Alias können die Namen vereinfacht werden, z.B. auf Order und Approval.


Im Reiter Globals werden zwei Konstanten angelegt. 'minimal discount' mit dem Wert 1 und 'maximal discount' mit dem Wert 10.


Das Ergebnis sollte dann wie oben aussehen.


Damit können jetzt die ersten Business Phrases erstellt werden. Diese sind die umgangsprachlichen Bausteine für die Verbal Rules. Als erstes wird eine Test Phrase namens 'Discount is valid' angelegt. Das Mapping wird dann wie abgebildet erstellt, so dass ein gültiger Rabatt abgebildet wird.


Entsprechend wird noch eine zweite Test Phrase benötigt, die genau auf das Gegenteil testet, also einen Nachlass der niedriger als der Mindest- oder höher als der Maximalwert ist.


Zusätzlich werden noch zwei Action Phrases benötigt. Create Approval erstellt mittels assert ein neues Approval mit dem Text "APPROVED"


Analog dazu wird die Action Phrase Disapprove mit dem String "DISAPPROVED" erstellt.


Die Verbal Rules lassen sich auch mehrsprachlich nutzen. Dazu wird zunächst auf dem Reiter Translations ein neues Resource Bundle für Deutsch erstellt.


Danach können hier dann passende Übersetzungen eingetragen werden.


Jetzt sind alle Bausteine komplett und die Verbal Rules können erstellt werden. Hierzu geht es weiter auf dem jeweiligen Ruleset unter dem Reiter Verbal Rules. Die Regeln können hier aus den Test- und Action-Phrases zusammengestellt werden.


Neben dem Bottom-Up Ansatz, bei dem erst wie oben alle Komponenten erstellt werden um daraus die Verbal Rules zu erstellen, ist auch ein Top-Down Ansatz möglich. Hier werden die Verbal Rules einfach frei definiert, die entsprechenden Phrases erstellt der JDeveloper im Hintergrund.
Somit könnte zunächst ein fachlicher Anwender die Regeln umgangsprachlich formulieren, und erst später werden diese von einem Entwickler auf die Technik abgebildet. Und bis das geschehen ist, befindet sich die Verbal Rule im Zustand Draft.


Bei den Business Phrases werden dann auch die automatisch angelegten Phrases angezeigt. Auch diese sind bis zur Ausformulierung im Status Draft.


Um die neu angelegten Regeln zu testen, wird eine neue Test Suite auf dem Reiter Test erzeugt.


In der Testsuite werden zwei Testfälle über das grüne Plus (+) angelegt.


Der erste Test 'Approve correct discount' testet z.B. auf einen Discount von 5 und erwartet das Ergebnis "Approved".


Nach dem gleichen Schema wird ein zweiter Test erstellt, der für einen zu hohen Discount auf das Ergebnis "DISAPPROVED" testet.


Dann geht es wieder hoch auf Ebene der Test Suites, am schnellsten per Combobox 'Test Component'. Hier wird der Test mit dem grünen Pfeil gestartet.


Wenn bis hier nichts schiefgelaufen ist, sollten die beiden Tests durchlaufen.
Somit wurde aus BPM die Business Rules Engine aufgerufen, es wurden Verbal Rules definiert und diese wurden auf korrekte Funktion getestet.

Montag, 12. November 2012

MDS-01370: MetadataStore configuration for metadata-store-usage

Folgendes Problem hat mich gerade etwas Zeit gekostet: die SOA bzw. BPM-Suite startet nicht aufgrund folgender Fehler:

<Nov 12, 2012 10:01:50 PM CET> <Error> <oracle.mds> <BEA-000000> <
oracle.mds.lcm.exception.MDSLCMException: MDS-01330: unable to load MDS configuration document   
MDS-01329: unable to load element "persistence-config"
MDS-01370: MetadataStore configuration for metadata-store-usage "soa-infra-store" is invalid.   
MDS-01376: Unable to get database connection from data source "mds-soa" configured with JNDI name "jdbc/mds/MDS_LocalTxDataSource".    
weblogic.common.resourcepool.ResourceDeadException: 0:weblogic.common.ResourceException: Could not create pool connection. The DBMS driver exception was: IO Error: Socket read timed out


Danach gibt es dann die üblichen mehrseitigen Exceptions. Die Lösung fand sich dann im OTN Discussion Forum. Zusammenfassend half folgendes:

Auf der Datenbank:
conn / as sysdba
alter system set PROCESSES=500 scope=SPFILE;
alter system set open_cursors=500 scope=SPFILE;

startup force

Auf der Commandline:
set RCU_JDBC_TRIM_BLOCKS=TRUE (Windows)
bzw.
export RCU_JDBC_TRIM_BLOCKS=TRUE (Unix)

Und als letzten Schritt das RCU ($RCU_HOME/bin/rcu) neu laufen lassen. Das bestehende Repository löschen und mit den gleichen Parametern wieder anlegen.

Bei der Gelegenheit sollte vielleicht gleich -XX:+UseCodeCacheFlushing in der setSOADomainEnv.sh gesetzt werden, um den JVM-Fehler 'CodeCache is full. Compiler has been disabled' zu vermeiden. Eine sehr gute Beschreibung dazu findet sich hier.

Mittwoch, 27. Juli 2011

Upgrade SOA/BPM-Suite 11.1.1.4 nach 11.1.1.5

1. Upgrade WLS 10.3.4 -> 10.3.5

Für das Upgrade muss zunächst der WebLogic Server von 10.3.4 auf 10.3.5 upgraded werden. Hierzu benötigt man den Patch von support.oracle.com. Die Patch-Nummern sind
  • 12395517 für Linux 32-Bit
  • 12395560 für Windows 32-Bit
Für alle anderen Plattformen einfach suchen nach Produkt='Oracle WebLogic Server', Release=10.3.5 und die gewünschte Plattform eingeben. Der WLS Patch Installer wird einfach mit den default-Einstellungen durchgeklickt.

2. SOA-Suite 11.1.1.5 Upgrade installieren

Als nächstes wird die SOA-Suite 11.1.1.5 benötigt, erhältlich unter http://www.oracle.com/technetwork/middleware/soasuite/downloads/index.html.

Den Installer für die SOA-Suite startet man dann nach dem Entpacken wie bei einer neuen Installation via .../Disk1/runInstaller. Die Dokumentation dazu findet man unter http://download.oracle.com/docs/cd/E17904_01/doc.1111/e16793/patch_set_installer.htm#insertedID0.


Der Installer erkennt die vorhandene Installation und bietet das Upgrade an, hier mit 'Yes' bestätigen.

3. Repository upgraden

Der nächste Schritt ist das Upgrade des Repositories mit dem Patch Set Assistant, der sich im Oracle_Home der SOA befindet unter z.B. Oracle_SOA1/bin/psa (s. Dokumentation: http://download.oracle.com/docs/cd/E17904_01/doc.1111/e16793/patch_set_assistant.htm#BABEBGEJ). Dieser muss für die Schemata DEV_MDS und DEV_SOAINFRA (Namen ggf. anpassen) analog dem folgenden Beispiel ausgeführt werden.


[oracle@oel5r5 bin]$ ./psa -dbConnectString //localhost:1521/orcl -dbaUserName sys -schemaUserName DEV_SOAINFRA
Oracle Fusion Middleware Patch Set Assistant 11.1.1.5.0

Enter the database administrator password for "sys":
Enter the schema password for schema user "DEV_SOAINFRA":
Log file is located at: /home/oracle/Oracle/Middleware/Oracle_SOA1/upgrade/logs/psa2011-08-03-14-10-17PM.log
Updating the Oracle Fusion Middleware Metadata Schema to release 11.1.1.5.0.
Updating schema for component Oracle SOA.
The command completed successfully

Das Ergebnis kann wie in der Doku beschrieben überprüft werden, oder einfach mit dem folgenden Statement:


SQL>  SELECT version, status, owner FROM schema_version_registry;

VERSION                        STATUS      OWNER
------------------------------ ----------- ------------------------------
11.1.1.4.0                     VALID       DEV_ORABAM
11.1.1.5.0                     VALID       DEV_MDS
11.1.1.2.0                     VALID       DEV_ORASDPM
11.1.1.5.0                     VALID       DEV_SOAINFRA

Zum Schluss noch gemäß Dokumentation die Packages neu compilieren und auf invalid objects prüfen.

SQL> conn / as sysdba
Connected.
SQL> @?/rdbms/admin/utlrp.sql

- - - Haufenweise Zeilen gelöscht - - -

ERRORS DURING RECOMPILATION
---------------------------
0

PL/SQL procedure successfully completed.

PL/SQL procedure successfully completed.

SQL> SELECT owner, object_name FROM all_objects WHERE status='INVALID';

no rows selected


4. Post Patching Tasks

Weiter streng nach Dokumentation müssen alle betreffenden Domains aktualisiert werden wie im folgenden Beispiel:


cd oracle_common/common/bin
./wlst.sh

wls:/offline>upgradeJRF('/home/oracle/Oracle/Middleware/user_projects/domains/bpm_domain')
upgradeJRF: skip, JRF is up-to-date.

Der nächste Schritt ist soa-upgrade.py, der Aufruf führte bei mir allerdings zu folgendem Ergebnis:

cd /home/oracle/Oracle/Middleware/Oracle_SOA1/bin

../common/bin/wlst.sh soa-upgrade.py --username weblogic --password Oracle123 --wlsHost oel5r5 --adminServerListenPort 7001 --targetList AdminServer

... seitenweise gelöscht ...

Current Status of your Deployment:
Deployment command type: deploy
Deployment State       : failed
Deployment Message     : weblogic.deploy.event.DeploymentVetoException: Cannot undeploy library Extension-Name: oracle.soa.worklist.webapp, Specification-Version: 11.1.1, Implementation-Version: 11.1.1 from server AdminServer, because the following deployed applications reference it: HT-01-simple-Form.war, UrlaubsAntragGenehmigen_UI.war, HT-04-Rules-Form.war, HT-02-Simple-Form.war, UrlaubsAntragErstellen_UI.war, HT-03-List-Form.war
No stack trace available.

... noch mehr gelöscht ...

WLSTException: Error occured while performing deploy : Target exception thrown while deploying application: Error occured while performing deploy : Deployment Failed. : Error occured while performing deploy : Deployment Failed.
Use dumpStack() to view the full stacktrace


Die Worklist-Application konnte nicht neu deployed werden, weil noch HumanTask-Anwendungen deployed waren die davon abhängen. Diese liessen sich auch nicht mehr über das Enterprise Manager Fusion Middleware Control undeployen.
In meinem Fall hatte sich während der Script-Ausführung die Datenbank-Verbindung zur Repository-DB irgendwie verknotet, so dass das Undeploy fehlschlug. Die schnelle Lösung war hier ein Neustart mit anschließendem manuellen Undeploy der Anwendungen.

Beim zweiten Versuch lief das Script dann auch fehlerfrei durch:

.Completed the deployment of Application with status completed
Current Status of your Deployment:
Deployment command type: deploy
Deployment State       : completed
Deployment Message     : no message

Fertig!


Mittwoch, 16. März 2011

BPM-Suite und Oracle Enterprise Repository im Zusammenspiel

Um einen Service aus dem Oracle Enterprise Repository im BPMN-Prozess zu nutzen, muss dieser zunächst auf Ebene des SCA Composites bekannt gemacht werden.

Hierzu wird von rechts aus der Component Palette ein Webservice in den rechten Bereich 'External References' des Composites gezogen.

Dies ist zunächst ein Platzhalter für einen Service, das Feld WSDL URL ist noch leer. Über einen Klick auf den Butten neben dem Feld kommt man in den Auswahldialog für einen bestehenden Service.

Die obere Auswahlbox wird umgeschaltet von 'File System' auf 'Resource Palette'. Unter 'IDE Connections' -> 'Oracle Enterprise Repository' -> 'OERConnection1' -> 'Asset Types' -> 'Service' findet sich der zuvor eingetragene HrInfoService2. Dieser wird per Doppelklick übernommen.

Die Werte werden automatisch aus dem Repository übernommen. Da unser Service nur über einen Port Type verfügt, ist dieser bereits korrekt voreingestellt und der Dialog kann mit 'OK' verlassen werden.

Der Service wird daraufhin im Composite unter 'External References' dargestellt.

Weiter geht es in der BPMN-Ansicht des UrlaubsProcess. Zunächst wird per Rechter Maustaste -> 'Add Role' eine neue Swimlane eingefügt. Als Name wird hierfür der 'Automatic Handler' ausgewählt, eine Farbe kann wahlweise vergeben werden. Die neue Swimlane wird zwischen die beiden bestehenden gezogen.
Nun wird per Drag&Drop von rechts aus der 'Component Palette' eine 'Serivce Task' genau auf die Verbindung zwischen 'Antrag' und 'Genehmigung' in der neuen Swimlane gezogen. Wenn die Verbindung richtig getroffen wurde, färbt sie sich blau.

In dem sich öffnenden Dialog wird auf im Reiter 'Basic' der Name 'Resturlaub abfragen' vergeben. Im Reiter 'Implementation' wird dann die Implementation auf 'Service Call' gestellt. Über die Lupe kann dann der HRinfoService ausgewählt werden. Die einzige Operation gethrinfo2 ist dadurch voreingestellt.
Dann ist noch der Haken zu setzen bei 'Use Associations', welche über den gelben Stift rechts davon noch definiert werden müssen.

Hier wird die personalnr aus dem UrlaubsDataObject auf die Eingabevariable empid gemappt, der Rückgabewert holidaysOut kommt in den resturlaub. Dann beide Dialoge mit 'OK' schliessen.
Jetzt muss die Anwendung neu deployed werden, damit die Änderungen auf den Server gelangen.


Jetzt kann wieder ein Urlaubsantrag erstellt werden. Wichtig ist jetzt, eine vorhandene Personalnummer zu nehmen (z.B. 100), da über diese jetzt ja über den Webservice die verbleibenden Urlaubstage ermittelt werden.
Nachdem der Antragsprozess gestartet werden kann, lässt sich im Enterprise Manager der korrekte Aufruf des Webservice überprüfen. Dort kann man Audit Trail des UrlaubsProcess' die Aktivität 'Resturlaub abfragen' über das Plus [+] aufblättern und bekommt über 'Instance left the activity' die XML-Payload angezeigt. Beispielsweise werden für die Personalnummer 100 noch 240 (!) Tage Resturlaub ausgewiesen.

Über ein Login mit dem Manager-Account jcooper/Oracle123 steht der Urlaubsantrag jetzt zur Genehmigung zur Verfügung. Hier werden auch die Verbleibenden Tage Resturlaub, die der Webservice geliefert hat, angezeigt.

Herzlichen Glückwunsch! Wenn Sie bis hier gekommen sind, haben Sie unseren BPMN und SOA-Governance Handson-Workshop erfolgreich abgeschlossen. Zusammenfassend haben wir folgendes erstellt:

  • Einen Prozess zur Anlegen und Genehmigen von Urlaubsanträgen
  • Die Ergebnisse werden über einen Adapter an ein beliebiges System weitergeleitet
  • Es wurde ein Antrag auf einen Webservice in das Repository gestellt
  • Ein bestehender Webservice wird erweitert und zur Wiederverwendung bereitgestellt
  • Der Prozess wurde um den Service erweitert, der hiermit wiederverwendet wurde.
Bei Fragen hierzu sprechen Sie uns wieder an:

Mittwoch, 2. März 2011

BPMN: Prozess-Simulation

Die Definition einer Prozess-Simulation erfolgt im 'BPM  Project Navigator'.

Auswahl von Simulations -> Simulation Definitions -> rechte Maustaste: 'New Simulation'

Der Default-Name kann übernommen werden, weiter mit 'OK'.

Wieder im BPM Project Navigator: Simulations -> Simulation Models -> 'New Simulation Model'

Der Prozess 'UrlaubsProzess' wurde bereits voreingestellt. Die Simulation sollte einen aussagekräftigeren 'Simulation Model name' bekommen wie z.B. 'UrlaubsSimulation'. Weiter mit 'OK'.

Das Simulation Model öffnet sich automatisch. Haken setzen bei 'Specify number of process instances to be created' und Vorsteinstellung 100 übernehmen.

Unter SimulationDefinition bei 'Process' die Checkbox "Include in Simulation" für UrlaubsProcess ankreuzen.

Gestartet wird die Simulation dann aus der BPMN-Ansicht des UrlaubsProcess. Hierzu im unteren Pane den Tabreiter 'Simulation' auswählen und den Start-Button (gründer Pfeil) klicken.

Im Prozess wird durch eine Animation der Lauf der Simulation angezeigt. Hier kann bei den Human Tasks die Anzal der Mitarbeiter mit + und - herauf- bzw. herabgesetzt werden, um zu überprüfen welche Auswirkungen dies auf die Simulation hat.
Im unteren Bereich wird dazu die aktuelle Statistik gezeigt.

Unter 'Simulation Models' -> 'UrlaubsProcess' -> 'UrlaubsSimulation' können die Simulationsparameter angepasst werden. Unter Flow Nodes (Prozess Schritte) können die jeweiligen Vorgaben wie Duration, Resources, Cost usw. eingestellt werden.
Damit ist der Basis-Prozess für diesen Workshop zunächst fertig.

Nächster Schritt ---> PL/SQL-Webservice erstellen, Datenbank vorbereiten