Thursday, 4 June 2009

Web Services features di Oracle Data Integrator 10g



Oracle Data Integrator supporta tre funzionalità principali riguardanti i Web Services:




  1. ODI Public Web Service: permette di invocare uno scenario ODI tramite chiamata ad un Web Service

  2. ODI Data Services: si tratta di Web Services, creati automaticamente da ODI, sovrastanti data store ODI di tipo DB (ad esempio una tabella, una vista o un altra sorgente dati registrata in ODI)

  3. Il tool ODIInvokeWebService, che, invocato all'interno di uno scenario ODI, mi permette di invocare un WS ed, eventualmente, utilizzare i dati di risposta in un flusso di integrazione.


Le funzionalità 2 e 3 prevedono l’utilizzo di Axis2 (v1.2), un web services engine open source, distribuibile sotto forma di web application (WAR file) su un qualsiasi JEE container, nel nostro caso Weblogic 10.3.



La versione di Oracle Data Integrator utilizzata in questo tutorial è la 10.1.3.5.0.



Installazione di Axis2 1.2 su Weblogic 10.3



Come passo preliminare, occorre installare Axis2 1.2 su WebLogic 10.3:




  • In primo luogo, scaricare Axis2 (versione 1.2) dal sito Apache Software Foundation

  • Decomprimere il file scaricato in una cartella del filesystem (ad es. c:\axis2) e posizionarsi con un prompt dei comandi nella cartella c:\axis2\webapp

  • Lanciare il comando ant : a questo punto verrà affettuata la build della web application di Axis2, ed il file axis2.war comparirà nella cartella c:\axis2\dist, creata automaticamente dallo scritpt Ant appena lanciato.

  • Copiare axis2.war in una cartella temporanea (ad esempio c:\temp).

  • Decomprimere axis2.war in c:\temp\axis2_exploded, quindi cancellare il file axis2.war.

Posizionarsi in c:\temp\axis2_exploded\WEB-INF.

Creare il file weblogic.xml con il seguente contenuto:


     <?xml version="1.0" encoding="utf-8"?> 
      <weblogic-web-app>
        <container-descriptor> 
          <prefer-web-inf-classes>true</prefer-web-inf-classes> 
        </container-descriptor> 
      </weblogic-web-app>


  • Posizionarsi in c:\temp\axis2_exploded\META-INF


  • Creare il file weblogic-application.xml con il seguente contenuto:


     <?xml version="1.0" encoding="utf-8"><weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
     <prefer-application-packages> 
        <package-name>com.ctc.wstx.*</package-name>
        <package-name>javax.xml.*</package-name>
        <package-name>org.apache.*</package-name>
        <package-name>org.xml.sax.*</package-name>
     </prefer-application-packages> 
     </weblogic-application>


  • A questo punto, dall'Administration Console di Weblogic:

Deployments > Install > Seleziona la cartella c:\temp\axis2_exploded\ > Seleziona axis2_exploded > Install as application



Installazione JDK e configurazione Agent ODI


L’installazione di ODI comprende, tra le varie componenti, una JRE. Perché le funzionalità Web Service di ODI siano utilizzabili, occorre però utilizzare una JDK (in questo tutorial è stata utilizzata la versione 1.5 update 1).


Come passo preliminare, occorre creare ed avviare un agent ODI (nel nostro caso si chiamerà MYAGENT):

Clipboard01

Clipboard02







Lo scopo è eseguire un semplice scenario ODI (nel nostro caso si chiamerà MYPACKAGE):

Clipboard03




Il Work Repository che andremo a utilizzare si chiamerà WR1:

Clipboard04




ODI Public Web Service (OdiInvoke)


Con questa funzionalità è possibile invocare uno scenario ODI mediante una chiamata ad un Web Service, distribuito su piattaforma Axis2 (versione 1.2). In questa sezione vedremo quindi come effettuare l'installazione di ODI Public Web Service in un dominio WebLogic 10.3, su cui sia stato preventivamente installato il framework Axis2 v1.2 in modalità exploded; supponiamo che Axis2 sia stato installato a partire dalla cartella c:\temp\axis2_exploded.



  • Copiare il file <ODI_HOME>\tools\web_services\odi-public-ws.aar in c:\temp\axis2_exploded\WEB-INF\services

  • Modificare il file c:\temp\axis2_exploded\WEB-INF\services\services.lst aggiungendo la riga 'odi-public-ws.aar' sotto la riga 'version.aar'.

  • Riavviare il container



A questo punto è possibile accedere alla console di Axis2 installata su WLS 10.3, mediante la seguente URL:


http://hostname:7001/axis2/services/listServices

Clipboard05



Nella schermata Services dovrebbe comparire il servizio OdiInvoke (che permetterà di invocare uno scenario ODI tramite un agent): cliccando su 'OdiInvoke' è possibile visualizzare il corrispondente WSDL.

Clipboard06




Utilizzando un qualsiasi web service client, ad esempio il WS Testing client di WLS (se installato in precedenza) è possibile quindi invocare tale WS.

Clipboard07




In fase di invocazione del WS, occorre indicare le info di connessione al Master Repository, il nome del Work Repository, il nome/password dell'utente ODI, nome e versione dello scenario da invocare (nel nostro caso MYPACKAGE/001), il contesto, livello di log, host/porta dell'agent precedentemente avviato, ed eventuali variabili da passare allo scenario. Ecco un esempio di request da passare allo scenario ODI:



<invokeScenarioRequest xmlns="xmlns.oracle.com/odi/OdiInvoke/">
<invokeScenarioRequest xmlns="xmlns.oracle.com/odi/OdiInvoke/"> <RepositoryConnection> <JdbcDriver>oracle.jdbc.driver.OracleDriver</JdbcDriver> <JdbcUrl>jdbc:oracle:thin:@localhost:1521:xe</JdbcUrl> <JdbcUser>MR</JdbcUser> <JdbcPassword>MR</JdbcPassword> <OdiUser>SUPERVISOR</OdiUser> <OdiPassword>SUNOPSIS</OdiPassword> <WorkRepository>WR1</WorkRepository> </RepositoryConnection> <Command> <ScenName>MYPACKAGE</ScenName> <ScenVersion>001</ScenVersion> <Context>Global</Context> <LogLevel>5</LogLevel> <Variables> <Name>TESTPROJECT.par1</Name> <Value>myteststring</Value> </Variables> </Command> <Agent> <Host>localhost</Host> <Port>20910</Port> </Agent> </invokeScenarioRequest>

Se la response ritornata dal WS è della forma seguente, l'invocazione è andata a buon fine:


    <soapenv:Body>
      <ns1:invokeScenarioResponse xmlns:ns1="xmlns.oracle.com/odi/OdiInvoke/">
         <ns1:Ok>true</ns1:Ok>
         <ns1:SessionNumber>11222</ns1:SessionNumber>
         <ns1:ErrorMessage />
      </ns1:invokeScenarioResponse>
    </soapenv:Body>

ATTENZIONE: se lo scenario è stato correttamente avviato, ma è successivamente andato in errore, la response ritornata dal WS sarà sempre TRUE!



ODI Data Services



La seconda funzionalità legata ai web services consiste nei Data Service; si tratta di Web Service specializzati che forniscono sia l'accesso ai dati contenuti in un datastore di tipo DB,  sia l'accesso ai cambiamenti di dati nel datastore (intercettati mediante Change Data Capture). Questi WS sono automaticamente generati da ODI e sono distribuiti in un WS container (ad es. Weblogic 10.3).


La tecnologia che permette di esporre un datastore come Web Service è contenuta nei Service Knowledge Module, che prelevano dati da un’istanza di Oracle DB e forniscono un’interfaccia verso di essi. I web service che ODI genera non usano le connessioni ODI, ma un data source JDBC definito sull’application server, e che quindi deve essere correttamente riferito nel tab Services tab relativo al model contenente il data store.


Utilizzando i Data Services, applicazioni esterne possano fare SELECT, UPDATE, DELETE (e cosi via) sui dati in un datastore.


Da ODI Topology Manager:



  • Creare un nuovo Data Server sotto la categoria Axis2, chiamandolo ad esempio AXIS2

  • Assegnare come base URL: http://localhost:7001/axis2/services/

  • Selezionare il radio button 'Carica Web Service con Axis2', immettendo

URL base : http://hostname: 7001/axis2/axis2-admin/

Utente : admin/axis2

Clipboard08

  • Selezionare Applica, e quindi OK

  • Creare un Physical schema, assegnando in ogni contesto il relativo Logical Schema (nel nostro caso useremo lo stesso nome del Physical schema, ovvero ‘AXIS2’)

  • Selezionare Applica, e quindi OK


Nel nostro esempio, utilizzeremo un datastore di tipo Oracle, che punta ad una tabella EMPLOYEES nello schema HR. Il datastore è contenuto nel Model XE_HR_MODEL:

Clipboard09

Quindi su Weblogic 10.3 occorre configurare un Data Source che punti allo schema dal quale voglio prelevare i dati (nel nostro caso, il data source punterà allo schema HR, e avrà come JNDI name HRDS).

Clipboard10




Da ODI Designer:



  • Aprire il Model del quale si desidera esporre i datastore (nel nostro caso XE_HR_MODEL)

  • Sotto il Tab Services impostare:

  • Nel campo Application Server, scegli il logical schema creato prima (AXIS2)

  • Impostare come Data Source Name il DS creato prima (es. HRDS)

  • Come SKM, scegliere SQM Oracle (importarlo nel progetto ODI se necessario)

  • Selezionare sottotab Deployed Datastores

  • Selezionare tutte le componenti che voglio esporre come Data Service

  • Selezionare Generate and Deploy

Clipboard11



Nella successiva finestra di dialogo, selezionare le opzioni Generate Code, Compile e Deploy, quindi impostare il context, indicare la cartella in cui archiviare il WS generato, quindi selezionare OK.

Clipboard12




NOTA BENE: Perché le operazioni di generazione codice, compilazione e deploy su Axis2 funzionino correttamente, la JDK a cui ODI punta deve essere al più la 1.5, altrimenti potrebbe venire sollevata la seguent eccezione:


java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.getXmlStandalone()Z



Se il Data Service è stato distribuito correttamente, dalla console di Axis2, nell'elenco degli Available Services, dovrebbe comparire il nuovo Data Service, relativo al datastore EMPLOYEES:

Clipboard13




Come si può notare, il Data Service espone 11 differenti operazioni, che permettono le comuni operazioni CRUD.







Tool ODIInvokeWebService



La terza funzionalità legata ai Web Service in ODI consiste nel tool ODIInvokeWebService, invocabile da un package in modo analogo alle altre activity in un flusso di integrazione.


Con questa funzionalità è possibile portare i dati ritornati dal Web Service all'interno del processo ETL; infatti, dopo l’invocazione al WS, questo tool inserisce la risposta del WS in un file XML: se si desidera estrarre i dati presenti nell’XML occorre processarlo mediante l’XML Driver di ODI, e quindi inserire i corrispondenti datastore in una o più integration interface.


Nel nostro caso, abbiamo un semplice progetto ODI, consistente in un unico package (InvokeWS_OSB):

Clipboard14



In questo package viene usato il tool ODIInvokeWebService:

Clipboard15




Selezionando l’activity, si aprirà il corrispondente pannello delle property:

Clipboard16




Per configurare il tool, selezionare il pulsante Advanced; si aprirà quindi l’editor di OdiInvokeWebService:

Clipboard17




Nel campo in alto occorre indicare la URL del WSDL relativo al WS che si desidera invocare. Clickando quindi sull’icona a forma di pianeta sulla destra della URL, avverrà la connessione al WSDL con il popolamento automatico di alcuni campi. A questo punto, per testare l’invocazione del WS, immettere un valore di input e selezionare il pulsante InvokeScenario. Se nel pannello a destra compare la risposta attesa, il Tool è configurato correttamente. Selezionare OK.


A questo punto alcuni dei campi nel pannello delle property dovrebbero risultare popolati:

Clipboard18



Come ultimo passo, impostare i campi:



  • Modalità di archiviazione del file di risposta = NEW_FILE (o FILE_APPEND se si desidera che le response vengano appese in un unico file)

  • Codifica del file di risposta e Codifica del file di risposta = impostare una codifica (es. UTF-8)

  • File di risposta = URI nel filesystem locale del file di risposta


A questo punto è possibile invocare lo scenario.

No comments:

Post a Comment