1 JCO Connection pool http://desvino.altervista.org SAP JCO – Connection Pool In questo documento mostriamo come utilizzare un pool di connessioni con Jco, in particolare gestiremo la connessione del nostro server J2EE con l’ambiente ABAP. SAP Java Connector (SAP JCo) è un componente middleware che permette lo swvilupo di componenti e applicazioni SAP-compatibili in Java. SAP JCo supporta la comunicazione con un SAP Server in entrambi le direzioni: inbound calls (Java chiama ABAP) e outbound calls (ABAP chiama Java). Da tenere in considerazione che Il Portal Runtime (PRT) offre il servizio JCo client service, il quale fornisce i clients JCo alle Iview, con la versione EP 6.0 SAP raccomanda l’uso di JCA SAP Connector Framework o di servizi Web, per realizzare la connessione con un sistema backend. Un pool è identificato dal suo nome ed è globale all’interno della JVM. Tutte le connessioni che si ottengono da un pool usano le stesse informazioni relative client e le stesse credenziali di accesso. Le classi per implementare un gestore di connessioni sono contenute nella libreria: com.sap.mw.jco.JCO Aggiungiamo in Java Build Path la libreria esterna com.sap.mw.jco_2.0.0\lib\sapjco.jar contenuta nei plugin in SAP\IDE\IDE70\eclipse\plugins. I passi in sequenza per ottenere una connessione dal pool sono i seguenti: 1. assegniamo un nome al pool, private static final String POOL_NAME = "MyPoolName"; 2. otteniamo il pool dal PoolManager della JVM. Jco PoolManager è un oggetto globale che gestisce tutti i pool, ad esso si accede tramite il metodo getClientPoolManager(). Il metodo getPool() permette di accedere ad un pool a partire dal suo nome. JCO.Pool pool = JCO.getClientPoolManager().getPool(POOL_NAME); 3. Se il pool non esiste (pool == null) ne creiamo uno nuovo con il metodo addClientPool(). JCO.addClientPool(POOL_NAME, 50, client, user, passwd, lang, ashost, sysnr); 4. Otteniamo una connessione con il metodo The getClient(). JCo fornisce una connessione esistente o una nuov a se il limite massimo di connessioni per il pool non è stato superato. JCO.addClientPool(POOL_NAME, 50, client, user, passwd, lang, ashost, sysnr); this.clientConn = JCO.getClient(POOL_NAME); 2 JCO Connection pool http://desvino.altervista.org 5. Otteniamo il repository e la funzione che ci interessa. repository = new JCO.Repository("repository", this.clientConn); function = repository.getFunctionTemplate("NOME_FUNZIONE_SAP").getFunction(); 6. Gestiamo l’interfaccia della funzione in relazione ai parametri di input e di output ed otteniamo il risultato. com.sap.mw.jco.JCO.ParameterList input = function.getImportParameterList(); input.setValue(iUser, "I_PARAMETER"); this.clientConn.execute(function); return function.getExportParameterList().getString("E_PARAMETER"); 7. Infine rilasciamo la connessione. JCO.releaseClient(clientConn); Il codice completo. package it.videsoft.model; import java.io.InputStream; import java.util.Properties; import com.sap.mw.jco.JCO; /** * @author vdestefano */ public class JCOComunicationPoolHandler { private static final String POOL_NAME = "MyPoolName"; private JCO.Client clientConn; private static JCO.Repository repository = null; private static com.sap.mw.jco.JCO.Function function = null; private String client = ""; private String user = ""; private String passwd = ""; private String lang = ""; private String ashost = ""; private String sysnr = ""; public JCOComunicationPoolHandler() {} public void setPoolConnection(String sistema) { try { JCO.Pool pool = this.getMyPool(); if (pool == null) { Properties logonProperties = new Properties(); InputStream in = this.getClass().getClassLoader().getResourceAsStream("it/enel/model/logon.proper ties"); logonProperties.load(in); client = (String) 3 JCO Connection pool http://desvino.altervista.org logonProperties.get("jco.client.client"); user = (String) logonProperties.get("jco.client.user"); passwd = (String) logonProperties.get("jco.client.passwd"); lang = (String) logonProperties.get("jco.client.lang"); ashost = (String) logonProperties.get("jco.client.ashost"); sysnr = (String) logonProperties.get("jco.client.sysnr"); JCO.addClientPool(POOL_NAME, 50, client, user, passwd, lang, ashost, sysnr); } this.clientConn = JCO.getClient(POOL_NAME); } catch (Exception ex) {} } private JCO.Pool getMyPool() { JCO.Pool pool = null; try { pool = JCO.getClientPoolManager().getPool(POOL_NAME); } catch (NullPointerException e) { return null; } if (pool != null) return pool; else return null; } public void createJCORepository() { repository = new JCO.Repository("repository", this.clientConn); } private String getPoolControl() { return this.poolCreateControl; } public String powgoRiepilogo(String iUser) { try { function = repository.getFunctionTemplate("NOME_FUNZIONE_SAP").getFunction(); com.sap.mw.jco.JCO.ParameterList input = function.getImportParameterList(); input.setValue(iUser, "I_PARAMETER"); this.clientConn.execute(function); return function.getExportParameterList().getString("E_PARAMETER"); } catch (JCO.Exception e) { return "JCO Exception: " + e.getMessage(); } finally { JCO.releaseClient(clientConn); } } }