Search the FirstSpirit Knowledge Base
Hallo Zusammen,
ich versuche verzweifelt aus meinem Modul (Service) einen Service eines Drittanbieters mit Hilfe der getService("ServiceName") aufzurufen:
FremdServiceProxy service = (FremdServiceProxy) this._environment.getConnection().getService("Fremd Service");
Leider erhalte ich immer folgende ClassCastException:
java.lang.ClassCastException: com.fremdFirma.fsmodule.FremdServiceProxy cannot be cast to com.fremdFirma.fsmodule.FremdServiceProxy
at com.meineFirma.modul.FsSceletonService.process(FsSceletonService.java:59)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at de.espirit.firstspirit.server.module.ServiceWrapperImpl.invoke(ServiceWrapperImpl.java:90)
at $Proxy35.process(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at de.espirit.firstspirit.io.DefaultServerHandler.callManager(DefaultServerHandler.java:62)
at de.espirit.firstspirit.server.io.handler.ManagerCall.doCall(ManagerCall.java:91)
at de.espirit.firstspirit.server.io.handler.ManagerCall.handle(ManagerCall.java:67)
at de.espirit.firstspirit.server.io.ManagerCallWorker.run(ManagerCallWorker.java:108)
at de.espirit.firstspirit.server.ExecutionManagerImpl$RunnableWrapper.call(ExecutionManagerImpl.java:553)
at de.espirit.firstspirit.server.ExecutionManagerImpl$ExtendedCallable.call(ExecutionManagerImpl.java:520)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at de.espirit.common.util.BoundedExecutorService$RunnableWrapper.run(BoundedExecutorService.java:419)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
at de.espirit.common.util.SuspendableThread.run(SuspendableThread.java:36)
Im Modul Developer Document finde ich zwar unter 2.10.2 einen Hinweis auf eine mögliche Ursache, allerdings bin ich mir nicht Sicher ob a) das Beispiel auch meinen Fall abdeckt und b) wie die angegebene Lösung für meinen Fall aussieht.
Benutzte FS Version: 4.2.461.48921
Hat hier jemand einen Tipp für mich? Danke im Voraus!
FremdServiceProxy existiert auch nur einmal, d.h. in einem jar?
habe sie den fs-server mal neugestartet?
schauen sie mal auf dem server in das data/modules verzeichnis...sind dort mehrere "alte" *jars/*.fsm's ihres moduls vorhanden? wenn ja, mal alle loschen und das modul neu installieren
definieren Sie die Dienste mal so:
<?xml version="1.0" encoding="UTF-8"?>
<module>
<name>MeinModul</name>
<version>0.1</version>
<description>-</description>
<vendor>meineFirma</vendor>
<components>
<service>
<name>Mein Service</name>
<description>-</description>
<class>com.meineFirma.modul.FsSceletonService</class>
</service>
</components>
<resources>
<resource>lib/mein_service.jar</resource>
</resources>
</module>
Hallo,
das Problem sollte in der Tat durch unterschiedliche Classloader verursacht werden. Wie sieht denn die module.xml aus und wie ist die Dateistruktur des Moduls?
Viele Grüße
J. Stephan
Hallo Herr Stephan,
die module.xml's & Dateistrukturen sehen wie folgt aus:
Mein Modul:
module.xml:
<?xml version="1.0" encoding="UTF-8"?>
<module>
<name>MeinModul</name>
<version>0.1</version>
<description>-</description>
<vendor>meineFirma</vendor>
<components>
<service>
<name>Mein Service</name>
<description>-</description>
<class>com.meineFirma.modul.FsSceletonService</class>
<resources>
<resource>lib/mein_service.jar</resource>
</resources>
</service>
</components>
</module>
Dateistruktur (MeinModul.fsm):
lib/
lib/mein_service.jar
META_INF/
META_INF/INDEX.LIST
META_INF/MANIFEST.MF
META_INF/module.xml
Fremd Modul:
module.xml:
<!DOCTYPE module SYSTEM "../../../server/module.dtd">
<module>
<name>FremdModul</name>
<version>9.9</version>
<description>-</description>
<vendor>fremdFirma</vendor>
<components>
<service>
<name>Fremd Service</name>
<description>-</description>
<configurable>com.fremdFirma.fsmodule.FremdServiceConfiguration</configurable>
<class>com.fremdFirma.fsmodule.FremdServiceServiceImpl</class>
<resources>
<resource>libs/FremdService0.jar</resource>
<resource>libs/FremdService1.jar</resource>
<resource>libs/FremdService2.jar</resource>
</resources>
</service>
</components>
</module>
Dateistruktur (FremdModul.fsm):
libs/
libs/FremdService0.jar
libs/FremdService1.jar
libs/FremdService2.jar
META_INF/
META_INF/module.xml
Danke für Ihre Unterstützung!
Viele Grüße,
Josef Awad
Hat keiner hier eine Idee?
Hallo,
so direkt kann ich an ihren Daten auch keinen Fehler feststellen. Es könnte zu Problemen kommen wenn in einem der Jars des Fremdmoduls eine Klasse existiert, die sie im Jar Ihres Moduls auch verwenden - dazu müsste man in die Jars schauen.
Alternativ könnten sie es auch mal ohne Cast probieren:
FremdServiceProxy service = this._environment.getConnection().getService("Fremd Service");
Viele Grüße
J. Stephan
Hallo,
danke für die Antwort, ich habe beides versucht:
1. Ich habe einfach alle meine Klassen um ein eindeutiges Kürzel erweitert, leider ohne Erfolg
2. Leider liefert die Methode getService ein Object zurück dass ich auf den FremdServiceProxy Casten muss um Methoden des Services nutzen zu können -> kein Erfolg
Leider erscheint mir die Aussage der Dokumentation widersprüchlich, wenn Services zwar immer als global verfügbar deklariert werden aber dann doch von unterschiedlichen Classloadern geladen werden und somit nicht untereinander kommunizieren können.
Wie kann man dieses Problem vermeiden?
FremdServiceProxy existiert auch nur einmal, d.h. in einem jar?
habe sie den fs-server mal neugestartet?
schauen sie mal auf dem server in das data/modules verzeichnis...sind dort mehrere "alte" *jars/*.fsm's ihres moduls vorhanden? wenn ja, mal alle loschen und das modul neu installieren
definieren Sie die Dienste mal so:
<?xml version="1.0" encoding="UTF-8"?>
<module>
<name>MeinModul</name>
<version>0.1</version>
<description>-</description>
<vendor>meineFirma</vendor>
<components>
<service>
<name>Mein Service</name>
<description>-</description>
<class>com.meineFirma.modul.FsSceletonService</class>
</service>
</components>
<resources>
<resource>lib/mein_service.jar</resource>
</resources>
</module>
Hallo Zusammen,
das war die Lösung!
Für mein Verständnis: Bedeutet eine Ressourcendeklaration innerhalb der Service Tags in der module.xml, dass diese Ressource nicht mit demselben Classloader geladen werden wie diejenigen die außerhalb der Service Tags deklariert werden? Das sollte in der Dokumentation noch ergänzt werden (sofern ich das nicht überlesen habe).
Vielen Dank für die Geduld und Hilfe!
Viele Grüße,
Josef Awad
P.S. Der Cast auf den FremdServiceProxy war notwenig