SAP JCo 3.0 + Tomcat 6.0

Hallo an Dich!
Zuletzt ging es an dieser Stelle um das Deployen von Java Anwendungen auf Tomcat. Heute wird das Ganze erweitert um das erfolgreiche Einbinden von SAP’s JAVA-Connector JCo 3.0
JCo 2.0 wird relativ gut im Netz behandelt, doch mit JCo3 sieht es nicht so gut aus.
Was du brauchst:
jco lib: libsapjco3.so
jco jar: sapjco3.jar
libsapjco3.so kommt ins JDK-Verzeichnis.
unter ubuntu ist das:
/usr/lib/jvm/java-1.5.0-sun/jre/lib/i386

Die sapjco3.jar muss in den classpath der Anwendung, die auf tomcat deployed werden soll.
Weiterhin muss die sapjco3.jar im tomcat 6 unter lib kopiert werden. bei mir: (/usr/local/share/tomcat6/lib)
danach kann wie im tomcat deployment text vorgegangen werden, um zu deployen.
Eine Lösung habe ich für alle die, die JCo auf Tomcat6 betreiben wollen, jedoch auf zwei probleme stoßen.

1. Man kann den DestinationDataProvider nur einmal registrieren

2. die Abfrage Environment.isDestinationDataProviderRegistered() produziert nach einigen Durchläufen folgende Exception:

java.lang.ExceptionInInitializerError: Error getting the version of the native layer: java.lang.UnsatisfiedLinkError: com/sap/conn/rfc/driver/CpicDriver.nativeCpicGetVersion

Der Fehler wird vermutlich durch einen Bug in JCo hervorgerufen. Möglich ist auch, dass es an falschen Einstellungen des Dataproviders liegt. Wie auch immer: eine Lösung ist, das setzen dees Dataproviders in einen leeren Try Catch Block zu schreiben und somit die fehlerhafte isDestinationDataProviderSet() methode nicht aufzurufen.

Code mit isDestinationDataProviderSet():

public SAPConnection(SAPServerData serverData){
		this.serverConnectionProperties = new Properties();
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_ASHOST, serverData.getHost());
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_SYSNR, serverData.getSystemNr());
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_CLIENT, serverData.getClient());
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_USER, serverData.getUser());
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_PASSWD, serverData.getPassword());
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_LANG, serverData.getLanguage());
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10");
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "5");
		//this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_EXPIRATION_PERIOD, Integer.toString(serverData.getTimeout()));

		//set properties of testsystem provider
		provider.changePropertiesForABAP_AS(serverConnectionProperties);

		//avoid multiple provider loading, which would lead to an exception
		if(!Environment.isDestinationDataProviderRegistered()){
			//register provider
			Environment.registerDestinationDataProvider(provider);
		}

		//try to establish connection
		try{
			this.destination = JCoDestinationManager.getDestination(SAP_SERVER);
			this.repository=this.destination.getRepository();
		}
		catch( JCoException e){
			e.printStackTrace();
			return;
		}
	}

Code ohne isDestinationDataProviderRegistered():

public SAPConnection(SAPServerData serverData){
		this.serverConnectionProperties = new Properties();
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_ASHOST, serverData.getHost());
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_SYSNR, serverData.getSystemNr());
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_CLIENT, serverData.getClient());
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_USER, serverData.getUser());
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_PASSWD, serverData.getPassword());
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_LANG, serverData.getLanguage());
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "10");
		this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "5");
		//this.serverConnectionProperties.setProperty(DestinationDataProvider.JCO_EXPIRATION_PERIOD, Integer.toString(serverData.getTimeout()));

		//set properties of testsystem provider
		provider.changePropertiesForABAP_AS(serverConnectionProperties);

		//avoid multiple provider loading, which would lead to an exception.
		try {
			//register provider
			Environment.registerDestinationDataProvider(provider);
		} catch (Exception e1) {}

		//try to establish connection
		try{
			this.destination = JCoDestinationManager.getDestination(SAP_SERVER);
			this.repository=this.destination.getRepository();
		}
		catch( JCoException e){
			e.printStackTrace();
			return;
		}
	}

Schreibe einen Kommentar