Jun 14, 2011

Χρησιμοποιώντας τον DbAdapter σε PL/SQL packages στο Oracle SOA Suite

Το Oracle SOA Suite μας επιτρέπει να προσθέσουμε ως συστατικά στοιχεία των ροών μας (composites) και στοιχεία που βρίσκονται σε μια βάση, όπως για παράδειγμα την κλήση μιας PL/SQL procedure ή function.

Δυστυχώς δεν υπάρχει τρόπος (τουλάχιστον μέχρι την έκδοση 11.1.1.5) ώστε να κατασκευαστούν μαζικά endpoints για όλες τις συναρτήσεις/διαδικασίες ενός database package ή έστω κατόπιν επιλογής. Απεναντίας πρέπει να επαναλάβουμε πολλές φορές τα βήματα.της δημιουργίας ενός database adapter για κάθε συνάρτηση του ενδιαφέροντός μας. Μια καλή προσέγγιση θα ήταν να δημιουργήσουμε ένα ξεχωριστό SCA (composite) που θα ομαδοποιεί όλες τις database procedures που ανήκουν σε ένα PL/SQL package ώστε να λειτουργεί ως wrapper κατά κάποιο τρόπο. Θα χρειαστούμε μια μικρή επεξεργασία σε WSDL ώστε να φθάσουμε στο επιθυμητό αποτέλεσμα.

Ξεκινάμε λοιπόν ένα καινούργιο empty composite και προσθέτουμε προοδευτικά όλα τις procedures που μας ενδιαφέρουν (οι οποίες ενδεχόμενα ανήκουν στο ίδιο PL/SQL package) με την βοήθεια του database adapter.

Αφότου έχουμε προσθέσει δυο συναρτήσεις (πχ Procedure1 και Procedure2) το αποτέλεσμα δείχνει ως εξής στον composite editor μας. Έχουν αντίστοιχα δημιουργηθεί τα wsdl για τις PL/SQL procedures και φυσικά τα συνεπαγόμενα xsd.

Στη συνέχεια δημιουργούμε ένα νέο WSDL document, για παράδειγμα το DBWrapperService. Σαν τοποθεσία αυτού του αρχείου δεν προτιμούμε τον κατάλογο WEB-INF/wsdl αλλά αυτόν που βρίσκεται ήδη το composite.xml και τα υπόλοιπα WSDL του DBAdapter. Αυτό το αρχείο θα αποτελέσει την περιγραφή της υπηρεσίας μας που θα συγκεντρώνει όλες τις PL/SQL μεθόδους και θα αντιπροσωπεύεται από έναν Mediator.

Τώρα θα χρειαστεί να καταφύγουμε στην επεξεργασία του WSDL, ώστε να συμπεριλάβουμε τα external references του Database Adapter που κατασκευάσαμε. Ανοίγουμε λοιπόν το WSDL της πρώτης υπηρεσίας (Procedure1) και ανατρέχουμε στον κώδικά της ώστε να αντιγράψουμε συγκεκριμένες ενότητες στο DBWrapperService WSDL. Αυτά που μας ενδιαφέρουν είναι η δήλωση του namespace, του import του xsd καθώς και αυτή του message type και του operation.

Επαναλαμβάνουμε τη διαδικασία και για τη δεύτερη υπηρεσία μας και το τελικό WSDL πια μοιάζει ως εξής:

Προσθέτουμε στο composite μας ένα Mediator που θα βασίζεται στο WSDL που μόλις διαμορφώσαμε.

Συνδέουμε το mediator με τα services και έχουμε ένα πλήρη διάγραμμα. Το Mediator έχει εξάγει τις δυο μεθόδους από τον DBAdapter σε ένα service, φυσικά διατηρώντας οποιαδήποτε transaction χαρακτηριστικά.

No comments: