Manchmal ist ein Service-Bus für die anstehende Aufgabe nicht ausreichend. Sie können EJBs und JMS-Warteschlangen verwenden, aber das könnte zu viel des Guten sein. Hier kann ein Java Callout die Rettung sein. Dieser Artikel zeigt Ihnen, wie Sie einen Callout mit 'komplexen' Objekten erstellen. Auf dem Bus können Sie Java-Objekte weitergeben oder sie auf dem Bus verwenden (dies erfordert einen kleinen Transformationsschritt). Ich habe den AquaLogic Service Bus Version 10.2 verwendet, aber ich denke, es sollte mit jeder Version funktionieren, die Java Callouts unterstützt. Der einzige Unterschied kann die Version von xmlbeans sein (AL 10.2 verwendet Version 1.0.3)
Bei unserem Kunden haben wir ein kleines Proof-of-Concept mit einem Java Callout durchgeführt, uns aber letztendlich für eine andere Lösung entschieden. Das Java Callout kann jedoch sehr nützlich sein. In diesem Artikel zeigen wir Ihnen, wie Sie damit loslegen können. Ich gehe davon aus, dass Sie zumindest ein wenig Erfahrung mit dem alsb und Maven 2 haben. Das Erstellen eines Proxy-Dienstes und die Bearbeitung eines Nachrichtenflusses sollten ausreichen. Die Voraussetzungen für ein Java Callout sind einfach. Jede statische Methode in einer jar-Datei ist ausreichend. Sie können sogar Ihre selbst erstellten Objekte zurückgeben (diese müssen nicht einmal serialisierbar sein). Ein Nachteil ist, dass Sie mit diesen Objekten auf dem Bus nichts anfangen können, da sie nur ein Objekt mit einer ID sind. Sie können diese Objekte jedoch an einen anderen Java-Aufruf übergeben und sie wie Ihre regulären Java-Objekte verwenden. Die statische Methode, die Sie aufrufen möchten, sollte sich in einer jar-Datei befinden, die auf dem alsb geladen wird (es handelt sich also NICHT um eine Bibliothek in WebLogic). Es ist erlaubt, Abhängigkeiten in dieser jar-Datei zu hinterlegen, so dass theoretisch alles möglich ist. Die Idee ist jedoch, die Anwendung klein und einfach zu halten, andernfalls sollten Sie EJBs und JMS mit einer Bibliothek oder einer Anwendung in WebLogic verwenden. Es ist sehr unbequem, wenn Sie die Objekte einfach weitergeben können. Es gibt jedoch einige Arten von Objekten, die über den Bus verarbeitet werden können. Diese Objekte sind Primitive, String, BigDecimal, BigInteger, byte[], String[] und XmlObject. XmlObject ist ein Objekt, das vom Apache Xml Beans-Framework bereitgestellt wird und im Grunde eine Xml-Darstellung eines Java-Objekts ist. Ich weiß, dass die Konvertierung eines Objekts in Xml auf dem Bus erfolgen sollte und es wäre schön, wenn ein Java-Objekt an den Bus übergeben werden könnte, aber das ist einfach nicht der Fall und dies ist die sauberste Lösung, die mir eingefallen ist. Jetzt, wo Sie die Theorie kennen, können wir uns die Hände schmutzig machen:
Vorbereitung
Erstellen Sie eine Klasse mit einer statischen Methode und paketieren Sie sie in einer jar-Datei. Ich habe die folgende Maven-Abhängigkeit zu einer leeren pom.xml hinzugefügt:
<Abhängigkeiten> <Abhängigkeit> <groupId>xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <Version>1.0.3</version> <Umfang>kompilieren</scope> </dependency> </dependencies>
Dadurch erhalten Sie die Apache Xml Beans-Bibliothek zur Kompilierzeit. Diese Bibliothek ist im gepackten jar ausgeschlossen, da sie in WebLogic enthalten ist. Die Java-Klasse : [java]public class CalloutDemo { public static String getString(String input) { System.out.println("input: " + input); return "Ein Fahrrad kaufen bei " + input + "?"; } public static XmlObject getCode(String input) throws XmlException { System.out.println("input: " + input); String xmlString = String.format("<root><mainCode>%s</mainCode><subCode>%s</subCode></root>", "mc", input); XmlObject instance = XmlObject.Factory.parse(xmlString); return instance; } public static Code getCode() { return new Code("hoofdCode", "subCode"); } public static void printCode(Code code code) { System.out.println("code: " + code); } }[/java] Diese Klasse gibt einen Hauptcode und einen Untercode für einen eingegebenen String oder einfach einen neuen String auf der Grundlage eines eingegebenen Strings zurück. Apache Xml Beans ist für die Rückgabe 'komplexer Objekte' vorgesehen. In diesem Beispiel gebe ich einen String und ein XmlObject zurück. Wenn Sie ein normales Java-Objekt (z.B. ein Domain-Objekt) zurückgeben und dieses auf dem Bus ausgeben, sehen Sie etwas wie dieses: <con:java-content ref="jcid:5333178f:11fa2a0451c:-7fda" xmlns_con="https://www.bea.com/wli/sb/context"/> Es ist nur ein Zeiger auf ein Objekt. Wenn Sie diesen Zeiger an einen anderen Java-Aufruf weitergeben, wird er wieder zu einem Objekt. Es ist nicht möglich, Transformationen vorzunehmen oder das Java-Objekt auf dem Bus zu betrachten, Sie können es nur weitergeben (und wahrscheinlich nur an dieselbe VM-Instanz) Keine Raketenwissenschaft, nur als Beispiel. Wenn Sie den oben dargestellten Code verstanden haben, ist es an der Zeit, alles auf den Bus zu legen. Führen Sie jedoch zunächst den Befehl 'mvn package' aus, um das Projekt zu kompilieren und ein jar zu erstellen.
Im Bus
Öffnen Sie die AquaLogic Service Bus-Konsole (ich verwende übrigens die Weboberfläche).
Erstellen Sie eine Sitzung mit der Schaltfläche Erstellen. Erstellen Sie dann im Projekt-Explorer ein neues Projekt (ich habe mein Projekt callout-test genannt)
Klicken Sie im Projektbaum auf callout-test und erstellen Sie eine jar-Ressource.
Geben Sie der Ressource einen Namen (z.B. callout-test-jar) und laden Sie das jar hoch, das Ihnen Maven geliefert hat (aus dem Zielordner).
Wenn das jar hochgeladen ist, können Sie es durchsuchen. Sie sehen Ihre brandneue Klasse mit all ihren Methoden.
Erstellen Sie nun einen neuen Proxy-Dienst (callout-ps), geben Sie ihm einen Namen, klicken Sie auf last und dann auf save.
Bearbeiten Sie den Nachrichtenfluss und fügen Sie ein Pipeline-Paar hinzu. Fügen Sie eine Stufe in der Anfrage-Pipeline hinzu. Bearbeiten Sie diese Stufe und fügen Sie eine Aktion hinzu:
Nachrichtenverarbeitung, Java Callout.
Wenn Sie auf
Auf den Prüfstand stellen
Wenn alles gespeichert ist, ist es an der Zeit, den Proxy-Dienst zu testen. Suchen Sie den Proxy-Dienst in Ihrem Projekt-Explorer und klicken Sie auf das Debugsymbol (das kleine Fehlersymbol in der Aktionsspalte). Da wir einen beliebigen xml-Dienst erstellt haben, können Sie in das Feld Nutzdaten alles eingeben, solange es sich um xml handelt. Klicken Sie auf die Schaltfläche Ausführen und Sie erhalten die Antwort, die Sie in das Feld Nutzdaten eingegeben haben. Natürlich wollen wir auch sehen, was intern passiert ist. Klicken Sie auf Home und dann auf Pipeline Alerts. Wahrscheinlich gibt es einen neuen Alarm mit dem Namen 'AquaLogic Service Bus Alert' mit einem Zeitstempel von vor ein paar Sekunden. Klicken Sie auf diesen Alarm und Sie sehen den neuen String im Feld Beschreibung:
Da wir System.out.println verwendet haben (ich weiß, es ist böse, aber ich wollte keine Abhängigkeiten in meinem kleinen Jar), zeigt die Serverkonsole: input: Harrie
Der nächste Schritt
Jetzt ist es natürlich an der Zeit, das 'erweiterte' xml zu verwenden. Öffnen Sie den Ablauf des Proxy-Dienstes erneut, klicken Sie auf Stage1, klicken Sie auf Bearbeiten, klicken Sie auf die Methode getString und ändern Sie sie in getCode (die Methode, die XmlObject zurückgibt). Geben Sie xs:string('Arie') in den Ausdruck ein. Da die Methode xml zurückgibt, können wir den gewünschten Teil der Nachricht drucken. Geben Sie $result/subCode bei der Warnmeldung ein (oder $result/subCode/text(), wenn Sie nur den Text ohne xml-Tags haben wollen, aber den Text, den Sie gerade eingegeben haben, als Warnmeldung auszugeben, ist nicht cool ;-) ) Speichern und aktivieren Sie und wiederholen Sie die Schritte aus 'Testen' Sie können leicht vorhersagen, was jetzt passiert. Leider haben wir in unserem Projekt keine Verwendung für den Java-Callout gefunden, aber er ist trotzdem ziemlich cool.
Haftungsausschluss
Ich habe in diesem Artikel den Begriff alsb und AquaLogic Service Bus verwendet, wahrscheinlich heißt er Oracle Service Bus. Aber alle, die ich kenne, sprechen immer noch vom AquaLogic Service Bus. Ich habe diesen Artikel vor einiger Zeit begonnen und da Oracle edocs.bea.com entfernt hat, kann ich Ihnen nicht die Quellen zeigen, aus denen ich meine Informationen bezogen habe.
Verfasst von
Jeroen van Wilgenburg
Unsere Ideen
Weitere Blogs
Contact



