Montag, 29. April 2013

OBTM: Proxy Service für BPEL-Prozess erstellen

Als letzte Komponente für unsere Business Transaction wird noch ein Proxy-Web Service erstellt, welcher den BPEL-Prozess aufruft. Der Startpunkt hierfür ist wieder der JDeveloper.


Hierfür können wir die bestehende HelloWorldServiceApp wiederverwenden. Über die Auswahlbox rechts vom Applikations-Namen bekommen wir ein Menü, dort 'New Project...' auswählen.


Hier links die 'Projects', rechts dann das 'Generic Project' auswählen und OK.


Bei den Project Technologies benötigen wir wieder die Web Services, welche automatisch Java nachziehen. Weiter mit Next und/oder abschliessen mit Finish.


Dann mit Rechtsklick auf das neue Projekt die 'New Gallery' aufrufen. Hier Web Services|Web Service Proxy auswählen und mit OK beenden.


Automatisch startet der Create Web Service Proxy Wizard, weiter mit Next.


JAX-WS als default stehen lassen und weiter mit Next ...


Jetzt muss der anzusprechende Service per WSDL benannt werden. Diese bekommt man z.B. im Enterprise Manager.


Hierzu wieder wie bereits im vorherigen Kapitel auf die Testseite des Composites navigieren. Gleich oben findet sich die WSDL-URL. Diese bitte Kopieren.


Die kopierte URL dann im JDeveloper einfügen, weiter mit Next...


Hier kann optional in Package Name vergeben werden, weiter mit Next...


Der Port Name wird bereits sinnvoll vorbelegt, die weiteren Optionen des Wizards werden für dieses Beispiel nicht benötigt. Beenden mit Finish.


Der JDeveloper erzeugt die benötigten Quellen für den Web Service Proxy und legt auch gleich einen Testclient an.


Der Testclient wird erweitert um die folgende Zeile

System.out.println( bPELProcess1.process( "Arne") );

wie oben dargestellt (natürlich kann der Name entsprechend personalisiert werden ;-)


Gestartet wird der Testclient wahlweise mittels Menü Run|Run HelloProxy.jpr, über den Button mit dem grünen Pfeil oder per F11. Wenn alles funktioniert, sollte die Begrüssung unten im Log auftauchen.

Diese komplexe Business-Funktionalität soll nun in einen Web Service verpackt werden.


Hierzu wird zunächst eine neue Java-Klasse benötigt. Erstellt wird diese z.B. durch Rechtsklick auf 'Application Sources' und 'New...'


Auswahl von Java|Java Class und OK


Hier bekommt die Klasse einen Namen, z.B. sayHelloProxy. Bei 'Constructurs from Superclass' und 'Implement Abstract Methods' können die Haken entfernt werden. Beenden mit OK.


Als Ergebnis liefert der JDeveloper die komplexe Klasse und öffnet sie im Editor. Hier muss jetzt der folgende Code ergänzt werden:

package helloProxy;

import java.util.Date;
import javax.jws.WebService;
import javax.xml.ws.WebServiceRef;

public class sayHelloProxy {
    @WebServiceRef
    private Bpelprocess1_client_ep bpelprocess1_client_ep;

    public String sayHello(String s)
    {
      bpelprocess1_client_ep = new Bpelprocess1_client_ep();
      BPELProcess1 bPELProcess1 = bpelprocess1_client_ep.getBPELProcess1_pt();
      // Add your code to call the desired methods.
      return new Date() + ": " + bPELProcess1.process(s);
    }
}

Das Ergebnis sollte dann wie folgt aussehen:



Damit ist die Geschäftslogik definiert. Damit der Proxy-Service irgendetwas tut, hängt er die aktuelle Systemzeit vor das Ergebnis.


Zum Erstellen des Web Services per Rechtsklick auf die sayHelloProxy.java (Achtung, Transferdenken: Dateiname stimmt nicht mit Screenshot überein) das Menü öffnen und 'Create Web Service...' auswählen.


Der default-Name passt üblicherweise, weiter mit Next...


Auch hier passen die Defaults so weit, weiter mit Next...


Die einzige Methode wird gefunden, die weiteren Optionen werden nicht benötigt. Beenden mit Finish.


Der JDeveloper hat die @WebService Annotation ergänzt. Die Datei kann geschlossen werden.


Jetzt muss der Service noch deployed werden. Hierzu wieder Rechtsklick auf das Projekt und Auswahl von Deploy|WebServices...


'Deploy to Application Server' und weiter mit Next...


Den richtigen Server auswählen und weiter mit Next...


Der Service wird nur auf einen Managed Server deployed, also Auswahl von 'Deploy to selected instances in the domain' und dann unten den richtigen Server auswählen. Weiter mit Next...


Zusammenfassung, beenden mit Finish.


Abwarten bis unten im Log '---- Deployment finished. ----' angezeigt wird.


Dann geht es weiter in der Weblogic Console. Hier unter Deployments den sayHelloProxyService lokalisieren und auf den Namen klicken.


Dann auf den Reiter 'Testing' gehen, den Baum aufklicken und auf den 'Test client'-Link klicken.


Einen Wert eingeben und den 'sayHello' Button klicken.


Unten sollte das Ergebnis inclusive des Datums vom Proxy-Service angezeigt werden. Damit OBTM etwas zu monitoren hat, per 'Re-Invoke' Button das ganze gleich ein paar Male wiederholen.


OBTM hat den neuen Service dann auch gleich gefunden und zeigt ihn entsprechend an.


Da wir jetzt nicht nur flache sondern kaskadierende Serivces haben, hat OBTM jetzt auch etwas zum anzuzeigen. In der Service Map werden die Abhängigkeiten korrekt angezeigt. Der BPEL-Prozess ruft den HelloWorldService auf und wird selbst sowohl vom Enterprise Manager, als auch vom sayHelloProxyService aufgerufen.
Dass OBTM diese Abhängigkeiten ohne weitere Konfiguration von alleine findet, ist eine der großen Stärken dieses Tools.


Auch die Container-Map hat jetzt etwas darzustellen, nämlich dass sich die Server auf Port 8003 (SOA-Server) und 8005 (JEE-Server) gegenseitig aufrufen. Ausserdem wird der SOA-Server vom Server auf Port 8001, dem Admin-Server auf dem der Test-Client läuft, aufgerufen.

Das OBTM hat damit die beteiligten Komponenten und ihre Zusammenhänge richtig erkannt, das Basis-Setup ist damit abgeschlossen.

OBTM: BPEL-Prozess für Hello-Service erstellen

Die Java-Container und der einzelne Service werden bereits automatisch vom Oracle Business Transaction Monitoring erkannt. Hierfür reicht aber auch ein normales System-Monitoring aus. Um wirklich eine komplexere Business Transaction zu monitoren, muss diese für dieses Handson Tutorial erst einmal erstellt werden.


Hierzu wird wieder im JDeveloper eine neue Anwendung erstellt.


Der Typ ist 'SOA Application', der Name z.B. soaApplication, Next.


Das Projekt bekommt den Namen soaProject1, die Project Technology SOA ist bereits ausgewählt -> Next.


Hier lässt sich gleich ein Composite mit einem BPEL-Prozess anlegen, beenden mit 'Finish'.


Der Prozess wird auf synchron gesetzt und als SOAP-Service exposed.


Wenn der Assistent fertig ist, öffnet sich gleich das SOA Composite. Hier wird per Drag&Drop ein Web Service hinzugefügt.


Daraufhin öffnet sich der Dialog mit den Details zum Web Service. Er bekommt einen Namen, z.B. helloService und dieWSDL. Diese kann über den 'Find existing WSDLs' Button hinzugefügt werden, oder auch einfach per Copy&Paste eingefügt werden, was in diesem Beispiel gemacht wird.


Die WSDL-URL bekommt man in der Weblogic Console im linken Baum unter Deployments. Dann auf der rechten Seite zum HelloWorldService navigieren und draufklicken.


Die Details vom HelloWorldService aufklicken und die WSDL-URL kopieren, z.B. im Firefox mit Rechtsklick und 'Copy Link Location'


Die URL wird dann in das Feld im Dialog eingefügt. Beim Verlassen des Feldes zieht der JDeveloper die Informationen aus dem WDSL-File. Da diese WSDL ohnehin nur einen Port Type hat, ist dieser gleich richtig voreingestellt. Beenden mit OK.


Dann wird der BPEL-Prozess mit dem Web Service verbunden indem vom ausgehenden Pfeil am BPEL-Prozess eine Verbindung zum helloService gezogen wird.


Das Composite sieht im Ergebnis dann so aus: ein Web Service, der einen einen BPEL-Prozess aufruft, der wiederum einen Web Service aufruft.


Weiter geht es im BPEL-Prozess, der per Doppelklick im Composite geöffnet wird. Hier wird eine Invoke Aktivität aus der Palette rechts zwischen receiveInput und replyOutput auf ein dort erscheinendes grünes (+) gezogen.


Dann wird die Invoke-Aktivität mit dem helloService verbunden, indem mit dem Pfeil von Invoke1 eine Verbindung zum HelloService gezogen wird.


Der Dialog mit den Details zum Invoke öffnet sich automatisch. Hier wird jetzt eine eingabe-Variable über das grüne Plus (+) hinzugefügt. 


Die default-Werte können so übernommen werden, beenden mit OK.


Der Wert wird entsprechend übernommen. Dann auf den Reiter 'Output' klicken und entsprechend mit der Output Variable verfahren. Dann mit OK schliessen.


Als nächstes wird eine Assign-Aktivität benötigt, die per Drag&Drop aus der Component Palette rechts zwischen receiveInput und Invoke1 gezogen wird.


Das Ergebnis sieht dann so aus. Per Doppelklick wird die Assign-Aktivität geöffnet.


Hier wird die dahinterliegende XSLT-Transformation konfiguriert, indem von der InputVariable des Prozesses der client:input String auf den arg0 String der InputVarialble des Invoke für den Web Service gezogen wird.


Als Ergebnis werden im unteren Bereich Quelle und Ziel der Kopieroperation angezeigt. Beenden mit OK.


Analog dazu wird eine zweite Assign-Aktivität zwischen Invoke1 und replyOutput gezogen.


Jetzt werden noch die Rückgabewerte gemappt. Vom return String der OutputVariable des Invoke1 wird kopiert auf den client:result String der outputVariable vom Prozess.


Das Ergebnis sieht dann wie oben aus. Die InputVariable vom Prozess wird kopiert in die InputVariable vom Invoke. Der Web Service wird aufgerufen, hinterher wird die outputVariable vom Invoke wieder kopiert in den ReturnValue vom Prozess.
Per 'Save All' Button kann alles gesichert,  das SOA-Composite und der BPEL-Prozess können geschlossen werden.


Jetzt muss das Composite noch auf den Application Server deployed werden. Per Rechtsklick auf den Projektnamen kann Deploy|soaProject1... ausgewählt werden.


'Deploy to Application Server' und Next ...


'Overwrite any existing ...' auswählen und Next ...


Den Application Server auswählen und Next ...


Der SOA-Server muss ausgewählt sein und weiter mit Next ...


Zusammenfassung, beenden mit Finish.


Abwarten, bis im Log "---- Deplyoment finished. ----" erscheint.


Dann wechseln in den Enterprise Manager der SOA Suite (z.B. http://hostname:8001/em) und das SOA-Projekt lokalisieren. Dort auf den Test-Button klicken.


Freundlicherweise bietet der Enterprise Manager gleich einen Stress Test für den Service an, hier den Haken setzen. Die default-Werte sind sonst OK. Unten muss noch ein Eingabestring vorgegeben werden, dann per 'Test Web Service'-Button starten.


Warten bis der Stress Test fertig ist, dann mit Close schliessen.


Dann wechseln ins OBTM. Der BPEL-Prozess mit seinen 50 Durchläufen wurde hier bereits registriert.
Damit ist der Grundstein für die Geschäftstransaktion in diesem Tuturial gelegt. Im nächsten Kapitel wird noch ein weiterer Service hinzugefügt.

---> Proxy Service für BPEL-Prozess erstellen