Aug 12, 2011

Συνεργασία ομάδων (teamwork) στο Oracle SOA

Στο έργο που ασχολούμαι αυτόν τον καιρό, η επικοινωνία μεταξύ Oracle ADF (επίπεδο εφαρμογής) και Oracle SOA/BPM Suite (επίπεδο ροών εργασίας και διασύνδεσης) γίνεται διαμέσου business events και του Event Delivery Network (EDN). Παρόλο που το ADF το ίδιο παρέχει άμεση συνδεσιμότητα με τα business events, η υλοποίηση που έχουμε ακολουθήσει ξεκινάει τα γεγονότα από PL/SQL packages. Υπάρχουν διάφορα πλεονεκτήματα σε αυτό:
  • Τα business events στο ADF προέρχονται αποκλειστικά από entities
  • Ως συνέπεια του παραπάνω είναι δύσκολο να "κουβαλήσουν" συνδυαστικά attributes, υπολογιζόμενα ή από άλλες οντότητες
  • Τα namespaces των business events είναι άμεσα συνδεδεμένα με το packaging των ADF entities, γεγονός που δεν είναι πολύ κομψό είτε για λόγους refactoring είτε για reusability από άλλες πηγές πληροφορίας
  • Ενεργοποιώντας τα business events σε PL/SQL, μπορούμε να ξεκινήσουμε ροές απευθείας από τον embedded Weblogic του JDeveloper, διαφορετικά θα χρειαστεί να "πειράξουμε" τον embedded Weblogic ώστε να περιλαμβάνει τις SOA βιβλιοθήκες
Έχουμε αναφέρει στο παρελθόν (http://serafeimk.blogspot.com/2011/03/testing-business-events-oracle-soa.html) το πώς μπορούμε να ξεκινήσουμε ένα business event από PL/SQL. Στις διαστάσεις ενός ομαδικού development, όπου ο καθένας προγραμματιστής διαθέτει τον δικό του SOA Server ώστε να κάνει έλεγχο των ροών, αλλά από την άλλη μοιράζεται ένα κοινό σχήμα βάσης δεδομένων για τα στοιχεία της εφαρμογής, αυτό αποτελεί πρόκληση: η συνάρτηση edn_publish_event() βρίσκεται σε κάθε ένα SOAINFRA σχήμα και θα πρέπει να καλεστεί κατάλληλα (ανάλογα με την ταυτότητα του ενεργού χρήστη/προγραμματιστή) από το μοναδικό, ενιαίο σχεσιακό σχήμα της εφαρμογής. Για να αντιμετωπίσουμε αυτό το ζήτημα θα χρειαστούμε μερικές ρυθμίσεις στην PL/SQL καθώς και στον Weblogic.

Από την πλευρά της PL/SQL θα πρέπει τα διάφορα SOAINFRA σχήματα να επιτρέψουν την εκτέλεση της συνάρτησης edn_publish_event() στο κύριο σχήμα της εφαρμογής (πχ app_schema)
grant execute on edn_publish_event to app_schema;

Έπειτα στο σχεσιακό μας σχήμα και στην PL/SQL που θα ξεκινήσει το business event, θα γράψουμε μια δυναμική SQL ώστε να προσδιορίσουμε το SOA σχήμα στο οποίο θα καταλήξει το event. Για να διακρίνουμε τους χρήστες/προγραμματιστές μας ως προς τα σχήματα που χρησιμοποιούν θα χρησιμοποιήσουμε το package DBMS_APPLICATION_INFO (http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_appinf.htm) το οποίο μπορεί να κουβαλήσει σε κάθε session μια εξτρα πληροφορία, ορατή από το v$session, που μπορούμε αυθαίρετα να ορίσουμε. Έτσι λοιπόν, μπορούμε να γράψουμε κάτι σαν το εξής:

l_soa_schema VARCHAR2(32); ... dbms_application_info.read_client_info(l_soa_schema); execute immediate 'begin ' || l_soa_schema || '.edn_publish_event(...';

Αυτό που απομένει είναι τώρα η αρχικοποίηση του client info. Έχοντας την αντιστοίχηση του κάθε ενός προγραμματιστή με ένα SOA σχήμα, μπορούμε να χρησιμοποιήσουμε τη δυνατότητα εκτέλεσης μιας εντολής SQL σε κάθε άνοιγμα νεάς σύνδεσης στο Weblogic. Έτσι, για παράδειγμα μπορούμε να ορίσουμε ως SQL την αρχικοποίηση του session metadata για το τρίτο σχήμα του SOA.

SQL BEGIN DBMS_APPLICATION_INFO.SET_CLIENT_INFO('DEV03_SOAINFRA'); END;

Συνεπώς οποιαδήποτε νέα σύνδεση που ξεκινά από αυτό το connection pool θα έχει το αναγνωριστικό 'DEV03_SOAINFRA' που θα αξιοποιηθεί από την PL/SQL για την εκκίνηση του business event στον κατάλληλο SOA Server.

No comments: