SAP JCO – Connection Pool - desvino

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);
}
}
}