MokaByte 88 - 7mbre 2004 

Integrazione di applicazioni Enterprise

VII parte: l'Integration Middleware

di

S. Rossini
e
G. Morello


Prosegue la serie di articoli dedicati alla integrazione. In questo articolo vedremo come sia possibile gestire in modo centralizzato le problematiche d'integrazione utilizzando un Integration Middleware.

Nel precedente articolo sono state esaminate alcune possibili modalità d'integrazione punto-punto tra applicazioni Enterprise (vedere [MOKA_INT6]).
Si sono implementate delle connessioni punto a punto tra le Applicazioni prese in esame ponendo l'accento sul singolo problema di comunicazione.
La figura 1 riassume gli scenari d'integrazione punto-punto affrontati in [MOKA_INT6].


Figura 1
: Scenari d'integrazione punto-punto

 

 

Cos'è un Integration Middleware?
Il termine Middleware genera spesso confusione, letteralmente è lo strato software posto nel mezzo. In linea con questa definizione, sono identificabili come Middleware un numero vastissimo di software completamente differenti fra loro (es. Application Server, MOM, JDBC, Screen Scraper).

Comunemente i Middleware sono suddivisi in tre macro-aree: Basic Middleware, Platform Middleware e Integration Middleware.
I Basic Middleware forniscono architetture consistenti per l'integrazione tra dati ed applicazioni. Esempi di questa tipologia sono ad esempio i MOM (Webshpere MQ, Sonic MQ, TIBCO/Rendezvous, FioranoMQ, Bea MessageQ, …) ed i Middleware di Data Management come ODBC e JDBC.
I Platform Middleware rappresentano la tipologia più complessa di Middleware come ad esempio gli Application Server (IBM WebSphere, BEA WebLogic, JBoss, …), i TP Monitor (BEA Tuxedo, IBM CICS, IMS), gli ORB (Borland VisiBroker, IONA ORBIX) ed i vari Portal Server. Spesso gli Application Server forniscono, integrandole direttamente, le funzionalità tipiche di TP e ORB.
Gli Integration Middleware sono pensati invece per connettere database ed applicazioni sviluppati su architetture differenti. Esempi di questa tipologia sono gli Integration Broker (IBM MQSeries Integrator; Tibco ActiveEnterprise, Microsoft BizTalk Server; Sonic ESB, Fiorano ESB …), i Business Process Managers (IBM MQSeries Workflow, Tibco InConcert2000, Vitria Technology BusinessWare Automator, Fiorano BIS, Bea WLI), i Gateways (MOM, Database e Platform) e gli Adapter.
In ambito open source, le proposte (per riferimenti vedere [OSISJ]) non hanno ancora raggiunto i livelli di credibilità raggiunti dai Platform Middleware (JBoss su tutti).
L
e più comuni funzionalità fornite da una Integration Suite sono:

  • Resource Adapter (RA): risolvono i problemi di comunicazione. Quasi tutti i fornitori EAI forniscono Adapter proprietari (sincroni ed asincroni) per la comunicazione con specifici EIS.
  • Messaging brokers: tipicamente opera come messaging layer (MOM) ed può operare sia in modalità point-to-point che publish/subscribe.
  • Integration Broker: si occupa del data mapping dei dati e dell'intelligent routing (content-based e/o publish-and-subscribe). Di solito il data mapping è l'operazione più costosa nell'integrazione visto che tipicamente i dati acquisiti da un RA in un formato proprietario devono essere trasformati (sintatticamente e/o semanticamente) secondo le esigenze del business object richiedente.
  • Workflow: in questo contesto si intende il coordinamento di business object e messaggi nell'esecuzione di processi di business. I tool specializzati nella gestione del workflow di processi di business sono denominati Business Process Manager (BPM).
  • Monitor delle attività di Business (analisi della storia degli eventi di business per tracciare l'accuratezza, la qualità e la sicurezza delle attività di business istanziate)

Queste funzionalità vengono tipicamente fornite (tutte o in parte) dagli Integration Middleware.


Figura 2: Macro struttura di un Integration Middleware

L'adozione di tecnologie più sofisticate quali sistemi di Messaging, Gateway e Middleware di comunicazione consentono di semplificare le problematiche di comunicazione supportando meccanismi sincroni, asincroni e real-time.

E' comunque doveroso annotare che, in assenza di una struttura centralizzata permanente e di una visione consistente delle problematiche di integrazione, la semplice adozione di queste tecnologie non riesce ad abbattere i costi e le complessità della "Spaghetti Integration".
Per affrontare quindi con successo un'attività d'integrazione bisogna tenere conto sia di un aspetto prettamente tecnologico che di un aspetto organizzativo e metodologico. Inoltre è opportuno valutare la reali necessità architetturali e/o aziendali che giustifichino l'adozione di un Integration Middleware.
In questo articolo ci si concentrerà prettamente sull'aspetto tecnologico.

 

Il ruolo architetturale dell'Integration Middleware
Da un punto di vista architetturale, l'Integration Middleware deve essere l'interfaccia unica attraverso cui transita ogni richiesta di comunicazione tra sistemi applicativi disomogenei permettendo una gestione centralizzata delle problematiche d'integrazione. Di fatto l'Integration Middleware agisce come unica interfaccia verso il client, diventando il punto di normalizzazione tra i vari sistemi integrati.


Figura 3
: Utilizzo di un Integration Middleware

 

Tool & wizard d'integrazione
Dal punto di vista dello sviluppo, l'adozione di una Integration Suite permette di semplificare lo sviluppo utilizzando tool, wizard ed utility che permettono un "rapido" sviluppo per risolvere i tipici comuni problemi d'integrazione.
Mediante tali tool è possibile ad esempio risolvere problematiche di data mapping e/o data transformation senza dovere necessariamente sviluppare codice "ad hoc".
Grazie ai Wizard è quindi possibile gestire in modo grafico il mapping di dati da sorgenti diverse, come come da CVS a XML, da SQL (JDBC, ADO, …) ad XML, da HTML ad XML, da WSDL ad XML, ecc …così come è possibile ottenenere processi di data conversion per trasformare i dati da un sistema ad un altro con differenti caratteristiche. Ad esempio un sistema potrebbe utilizzare la codifica Little Endian mentre un altro la codifica Big Endian o avere code page diverse (ASCII, EBCDIC,…).
Tutte queste problematiche di conversione sono risolte dall'opportuno tool che permette di scegliere quali conversioni effettuare senza richiedere nessun sviluppo di codice.


Figura 4
: Tool di mapping

Gli IM rendono inoltre disponibili "ready to use" i Resource Adapter (in modo "nativo" o installabili in un secondo momento) proprietari o standard (es: JCA vedere ([MOKABOOK2_JCA]]) che permettono di risolvere le problematiche di accesso a sistemi EIS eterogenei come DBMS, Host (CICS,IMS,3270,…), ERP, …

 


Figura 5: Configurazione di un RA per accedere a CICS

Mediante tool di workflow è possibile comporre, in modalità "drag & drop" processi che coinvolgono componenti e/o servizi trattati come "black box".



Figura 6: Tool di workflow di processo

Ogni suite d'integrazione permette di sviluppare servizi/componenti "ad hoc" per risolvere le specifiche esigenze di integrazione e/o di business.
Si tratta di sviluppare classi che si "appoggiano" su FWK proprietari. Tali classi saranno utilizzabili anche in modalità "drag & drop" nella fase di disegno del processo.

 

Un esempio d'integrazione
Concludiamo l'articolo con un esempio pratico. Riprendendo in esame lo scenario presentato in [MOKA_INT6] si realizzerà un processo che integri il servizio di concatenazione (l'EJB Concat installato su JBoss) ed il servizio di calcolo lunghezza (l'oggetto .NET Remoto) centralizzando nell'Integration Middlewarele problematiche d'integazione.



Figura 7: Introduzione di un Integration Middleware nello scenario proposto
(clicca sull'immagine per ingrandire)

Per l'esempio si è scelto, tra i tanti prodotti disponibili, Weblogic Integration 8.1 di BEA, la cui versione trial è liberamente scaricabile da Internet (vedere [WLI_DWNLD]).
La piattaforma WLI permette di avere i "tipici ingredienti" per affrontare l'integrazione in modo organico e centralizzato.
La suite d'integrazione di Bea permette di sviluppare dei Java Control che altro non sono che classi che incapsulano la logica di business e/o di accesso alle risorse da integrare.
L'IDE Weblogic Workshop permette lo sviluppo del Java Control sia in modalità grafica (design view) che via codice (code-view).
E' possibile quindi incapsulare il servizio di concatenazione delle stringhe all'interno di un Java Control di nome MokaConcat.

package services.ConcatJCS;
import com.bea.control.*;
public class ConcatImpl implements Concat, ControlSource {
  static final long serialVersionUID = 1L;
  public String getConcat(String x0, String x1) {
    // Aggiungere qui l'invocazione IIOP all'EJB Concat (Applicazione A)
    return x0 + x1; // per test
  }
}


Figura 8
: Weblogic Workshop: design view/code view del Java Control MokaConcat


Analogo discorso può essere fatto per il Java Control MokaCalculator.

package services.CalculatorJCS;

import com.bea.control.*;

public class CalculatorImpl implements Calculator, ControlSource {
  public Callback callback;
  static final long serialVersionUID = 1L;
  
  public int getLength(String s) {
    // Aggiungere qui l'invocazione SOAP al WS Calculator (Applicazione C)
    return s.length(); // per test
  }
}

Sviluppati i controlli è possibile creare un processo che li utilizzi. Un processo è un file JPD (Java Process Definition) che è "accompagnato" da un file XML che definisce il flusso del processo. Anche il JPD può essere creato in modalità Design View o Code View visto che il processo non è altro che una classe che deve implementare l'interfaccia com.bea.jpd.ProcessDefinition.

Definiti il punto d'ingresso e di uscita del processo, è possibile inserire via drag & drop i controlli all'interno del processo, definendo le variabili per memorizzare i dati di input e di output dei vari step del processo.

public class MokaSample implements com.bea.jpd.ProcessDefinition{

// dati di input del processo
public java.lang.String m_param2;
public java.lang.String m_param1;

// dato di output del processo
public int m_length;

// Reference ai Java Control
private services.ConcatJCS.Concat MokaConcat;
private services.CalculatorJCS.Calculator MokaCalculator;

. . . . . .


Figura 9: Design view del processo MokaSample

 

Di fatto il processo, una volta ricevuti i parametri in ingresso (x0 e x1) e memorizzati nelle sue proprietà (m_param1, m_param2)

public void clientRequest(java.lang.String x0, java.lang.String x1) {
//#START: CODE GENERATED - PROTECTED SECTION - you can safely add code above this comment in this method. #//
// input transform
// parameter assignment
this.m_param1 = x0;
this.m_param2 = x1;
//#END : CODE GENERATED - PROTECTED SECTION - you can safely add code below this comment in this method. #//
}

provvede ad invocare il Java Control MokaConcat (memorizzando il risultato della concatenazione nella proprietà "di appoggio" m_concat)

public void mokaConcatGetConcat() throws Exception {
//#START: CODE GENERATED - PROTECTED SECTION - ….. #//
this.m_concat = MokaConcat.getConcat(this.m_param1, this.m_param2);
//#END : CODE GENERATED - PROTECTED SECTION - ….. #//
System.out.println("MokaSample.mokaConcatGetConcat: this.m_Concat["+this.m_concat+"]...");
}

e successivamente il Java Control MokaCalculator (memorizzando il risultato nella proprietà m_length)

public void mokaCalculatorGetLength() throws Exception {
//#START: : CODE GENERATED - PROTECTED SECTION - ….. #//
this.m_length = MokaCalculator.getLength(this.m_concat);
//#END : : CODE GENERATED - PROTECTED SECTION - ….. #//
}

per poi ritornare al client il risultato

public int clientReturn() {
//#START: : CODE GENERATED - PROTECTED SECTION - ….. #//
return this.m_length;
//#END : : CODE GENERATED - PROTECTED SECTION - ….. #//
}

Per verificare il corretto funzionamento del processo, è possibile utilizzare l'utility Workshop Test Browser, attraverso cui è possibile invocare il processo specificando i parametri d'ingresso e verificandone il corretto svolgimento.


Figura 10: Test del processi MokaSample
(clicca sull'immagine per ingrandire)

Sino ad ora si è costruito un processo che incapsula e gestisce, in modo centralizzato, l'invocazione dei servizi di concatenazione e di calcolo.
Vediamo adesso come rendere disponibile il processo anche agli altri client, che, nello specficio esempio, sono l'Applicazione A (AXIS) e l'Applicazione B (.NET).
Per permettere l'invocazione del processo da parte di altre applicazione è possibile esportare il processo come Web Service.
Il file WSDL può essere generato o mediante il Workshop stesso o a run-time invocando l'URL

http://localhost:7001/Tutorial_Process_ApplicationWeb/MokaSample.jpd?WSDL

analogamente a quanto visto in [MOKA_INT4].
Per invocare il processo con Axis bisogna innanzitutto utilizzare l'utility WSDL2Java (vedere [MOKA_INT4]) sul file WSDL:

%JAVA_HOME%\bin\java org.apache.axis.wsdl.WSDL2Java -o . -p ws.axis
http://localhost:7001/Tutorial_Process_ApplicationWeb/MokaSample.jpd?wsdl

per ottenere i file Stub, Locator e l'interfaccia del servizio.
A questo punto è possibile sviluppare un client Java per invocare il processo:

public class MokaSampleTestClient {
  //Main method
  public static void main(String[] args){
    new MokaSampleTestClient().test(args[0],args[1]);
  }
  
  public MokaSampleTestClient() {}
  public void test(String word1, String word2) {
    try{
      MokaSampleSoap srv=new MokaSampleLocator().getMokaSampleSoap();
      System.out.println("RISULTATO: " + srv.clientRequest1(word1,word2));
    }
    catch(javax.xml.rpc.ServiceException rpce){ . . . }
    catch(Exception e) { . . . }
  }
}

Per invocare il Web Service da .NET, si utilizza il programma wsdl.exe (vedere [MOKA_INT5]) per ottenere la classe stub C# partendo dal WSDL del processo:

wsdl.exe /l:cs /o:MokaService.cs
http://localhost:7001/Tutorial_Process_ApplicationWeb/MokaSample.jpd?WSDL /n:moka

Ottenuta e compilata la classe stub (MokaSample.cs) è possibile creare un client C# per invocare il processo:

using moka;
public class MokaSampleTestClient {
public static void Main(string[] args) {
MokaSampleTestClient client = new MokaSampleTestClient();
client.test(args[0],args[1]);
}
public void test(string word1, string word2) {
MokaSample obj = new MokaSample();
Console.WriteLine("Risultato:" + obj.clientRequest1(word1, word2));
}
}


Figura 11: Scenario finale


Conclusioni
In questo articolo abbiamo mostrato un semplice esempio d'uso di un Integration Middleware.
Utilizzando gli strumenti forniti dal prodotto esaminato, abbiamo visto come sia semplice definire processi che integrino servizi Java con servizi .Net.
Sul piano architetturale abbiamo proposto un approccio in cui il Middleware gestisce centralmente le problematiche d'integrazione ed agisce come unica interfaccia verso il client, diventando di fatto il punto di normalizzazione tra i vari sistemi integrati.

 

Bibliografia
[MOKA_INT6] S.Rossini: Integrazione di applicazioni Enterprise (VI) Mokabyte N.83-Marzo 2004
[MOKABOOK2_JCA] S.Rossini-G.Morello: "Manuale pratico di Java: La piattafroma J2EE" (Capitolo 12: JCA), Ed.HOPS-2004 [http://www.mokabyte.it/manualejava2/download.htm]
[MOKA_INT1] S.Rossini: Integrazione di applicazioni Enterprise (I) MokabyteN.71-Aprile 2003
[MOKA_INT2] S.Rossini: Integrazione di applicazioni Enterprise (II) MokabyteN.72-Maggio 2003
[MOKA_INT3] S.Rossini, A. D'Angeli: Integrazione di applicazioni Enterprise (III) Mokabyte N.73-Giugno 2003
[MOKA_INT4] S.Rossini: Integrazione di applicazioni Enterprise (IV) MokabyteN.74-Luglio/Agosto 2003
[MOKA_INT5] S.Rossini, A. D'Angeli: Integrazione di applicazioni Enterprise (V) MokabyteN.74-Settembre 2003
[OSISJ] Open Source Integration Solutions Written In Java:
http://www.manageability.org/blog/stuff/open-source-messaging-integration-transformation-routing-java/view
[BEA] http://www.bea.com
[WLI_DWNLD] http://commerce.bea.com/index.jsp

 


MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems.
Tutti i diritti riservati. E' vietata la riproduzione anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it