Josef_Awad
I'm new here

Aufruf eines fremden Services: ClassCastException

Jump to solution

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!

1 Solution

Accepted Solutions

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>

View solution in original post

0 Kudos
7 Replies
stephan
I'm new here

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

0 Kudos

Hat keiner hier eine Idee?

0 Kudos

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

0 Kudos

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?

0 Kudos

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>

0 Kudos

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

0 Kudos