May 26, 2009

Καλώντας (call) Web Services από PL/SQL

Ενώ το πιο συνηθισμένο σενάριο είναι να "καταναλώσουμε" (consume) ένα web service από ένα Java πρόγραμμα, η Oracle προσφέρει μια αντίστοιχη δυνατότητα εδώ και καιρό και από τη PL/SQL. Μάλιστα το μοντέλο λειτουργίας είναι κάπως περίπλοκο, καθώς στηρίζεται στη δημιουργία Java stored procedures που χρησιμοποιούνται ως proxy objects για την κλήση του web service, ενώ με την σειρά τους ενσωματώνονται σε ένα PL/SQL wrapper ώστε να μπορέσουμε να το καλέσουμε από τον SQL κώδικα μας. Για καλή μας τύχη, η παραγωγή του απαραίτητου κώδικα είναι δουλειά του JPublisher και συντονίζεται από ένα command-line interface. Αλλά, ας τα δούμε όλα αυτά πιο αναλυτικά.

Οδηγίες για την κατασκευή PL/SQL proxy objects για web services βρίσκονται στο http://www.oracle.com/technology/sample_code/tech/java/jsp/dbwebservices.html Για τις εκδόσεις Oracle 10g R2 και 11g, αρκεί να κατεβάσουμε το callout utility 10.1.3.1 (http://download.oracle.com/technology/sample_code/tech/java/jsp/dbws-callout-utility-10131.zip) καθώς και το JPublisher 10.2 (http://download.oracle.com/otn/utilities_drivers/jdbc/10201/jpub_102.zip) Αφότου συμβεί αυτό, ανατρέχουμε στο README αρχείο του callout utility και ακολουθούμε τα βήματα ώστε να φορτώσουμε στη βάση το πακέτο utl_dbws που επί της ουσίας αφορά όλες τις JAX-RPC βιβλιοθήκες που παραδίδονται από τον OracleAS 10.1.3. Έτσι έχουμε στη διάθεση μας ως Java stored procedures, όλα τα συστατικά στοιχεία για την κλήση web services από την PL/SQL, κάνοντας χρήση δυνατοτήτων όπως WS-Security, WS-Reliability κτλ.

To φόρτωμα αυτών των βιβλιοθηκών προτείνεται να γίνει σε database σχήμα πλην του SYS, οπότε επέλεξα το σχήμα HR και όπως αναφέρουν οι οδηγίες, πρέπει να εκτελέσουμε μερικά grants. Όταν ολοκληρωθεί και αυτή η διαδικασία, μπορούμε να κατασκευάσουμε τα proxy objects με την βοήθεια του JPublisher (που επίσης κατεβάσαμε) για το Web Service που μας ενδιαφέρει (για το παράδειγμα του HelloWorld service) ως εξής:

./jpub -user=hr/hr -proxywsdl=http://localhost:7778/HelloWS/MySayHelloServiceSoapHttpPort?WSDL -package=sayhellows_wrapper -driver=oracle.jdbc.driver.OracleDriver -url=jdbc:oracle:thin:@localhost:1521:ora10g
O JPublisher είναι ένα γνωστό εργαλείο της Oracle, ενσωματωμένο στον JDeveloper, καθώς κατασκευάζει Java stubs από PL/SQL packages, κάνοντας την αντιστοίχηση μεταξύ των τύπων PL/SQL και Java. Στην περίπτωση των web services, ακολουθεί την αντίστροφη πορεία: φτιάχνει τα Java proxy objects των web services (παραγόμενο αρχείο: plsql_proxy.jar) ως Java stored procedures καθώς και ένα πακέτο PL/SQL wrapper κώδικα για να τα καλέσουμε.

Έτσι, εκτελούμε τον wrapper PL/SQL κώδικα (αρχείο plsql_wrapper.sql) που δημιουργήθηκε και φορτώνουμε τα proxy objects που παρήχθησαν ως εξής:

loadjava -u hr/hr -r -v -f -genmissing plsql_proxy.jar

Στην επόμενη φωτογραφία μπορούμε να διακρίνουμε το wrapper PL/SQL package που δημιουργήθηκε καθώς και μια πρότυπη εκτέλεση του web service client.

3 comments:

Paris Apostolopoulos said...

ρε συ Σεραφείμ χωρίς πλάκα τώρα, διαβάζω τέτοιο post και απλά αναρωτιέμαι μήπως η Oracle τα διαλύσει όλα με την Java!

Μια χαρά το post σου, αλλα αναρωτιέμαι τι σενάριο θα ήταν αυτό που θα με έκανε να καλέσω web service μέσα απο την oracle!!!!

με αγχώνεις!!!

Serafeim Karapatis said...

Η κλήση web services μέσα από PL/SQL είναι κάτι που ενδιαφέρει ιδιαίτερα τους προγραμματιστές της βάσης δεδομένων, που υλοποιούν κώδικα είτε απευθείας σε PL/SQL είτε σε Oracle Forms, το 4GL εργαλείο της Oracle. Υπάρχει πράγματι μεγάλη μερίδα προγραμματιστών που εξακολουθεί να χρησιμοποιεί αυτά τα εργαλεία/αυτή τη γλώσσα.

Δεδομένου ότι υπάρχει υποστήριξη του JVM μέσα από το kernel της Oracle, ήταν η πιο εύκολη λύση να υλοποιηθούν τα web service proxy objects σε Java, και να μεταφερθούν σε δεύτερο χρόνο ως Java stored procedures ώστε να μπορούν να κληθούν από PL/SQL.

spiretos72 said...

Κι εγώ αγχώθηκα!