Hallo Freunde des SAP,
kürzlich habe ich mit JCo 3 einen Webservice entwickelt, der eine SAP-Funktion aufruft und ausführt.
der Ablauf ist aus den zu JCo gelieferten Beispielen entnommen.
Folgendes Problem:
Der Service funktioniert für einige Anfragen und dann ohne erkennbaren Grund nicht mehr.
Das Problem ist folgender Aufruf:
Dieser verursacht nach mehrmaliger Anwendung einen Fehler und kann keinen Provider mehr setzen. Eine vorangegangene Abfrage isDestinationDataProviderSet() produziert ebenfalls eine wenig aussagekräftige Exception:
java.lang.ExceptionInInitializerError: Error getting the version of the native layer: java.lang.UnsatisfiedLinkError: com/sap/conn/rfc/driver/CpicDriver.nativeCpicGetVersion
Demnach habe ich keine Möglichkeit, einen einmal registrierten DestinationDataProvider von JCo zu trennen und einen neuen zu instantiieren.
Dass man einen Provider nur einmalig setzen kann, ist mir bekannt. Ich habe auch probiert, vor dem Setzen des Providers abzufragen, ob dieser bereits gesetzt wurde, doch dieser Versuch liefert o.g. Ergebnis.
Ich konnte bisher keine Informationen finden, die den Fehler erklären oder gar beheben könnten.
Es scheint, als ob die native JCo Bibliothek (libsapjco3.so) nach einigen Aufrufen von Tomcat/Websphere nicht mehr angesprochen werden kann.
Es is tmir jedoch ein Rätsel, warum das passiert. Ich vermute stark, ich habe einen Fehler bei der Konfiguration von JCo gemacht. Das sind meine Einstellungen:
Code: Alles auswählen.
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");
ServerData ist eine selbst geschriebene Klasse zur Verbindungsdatenhaltung.
Der Fehler ist leider nicht so reproduzierbar, dass ich ein konkretes Szenario beschreiben könnte mit welchem JCo abstürzt.
Er tritt augenscheinlich nach dem Zufallsprinzip auf, was sehr ärgerlich ist.
Für die kleinsten Tipps wäre ich enorm dankbar.
viele Grüße,
kdot