Zugriff auf Topic (eines WebSphere 6.1 AS) von einer RCP Anwendung aus

Thorsten Zegger

Grünschnabel
Hallo,
mich plagt folgedes Problem:

Ich habe eine RCP Applikation, die im Backend auf einen IBM WebSphere Applikaitonsserver (Version 6.1) zugreift. Der Zugriff auf eine SessionBean funktioniert einwandfrei.
Nun möchte ich die Anwendung auf einem Topic lauschen lassen. Ich habe mir ein kleines Testprogramm geschrieben, das lokal auf meinem Arbeitsplatz sich an die Topic anhängt und auf Messages lauscht und ein anderes Progrämmchen, das eine Message in das Topic postet. Funktionieren auch beide (!) :)

Dieses Programm in die RCP Anwendung eingebunden schlägt beim JNDI-Lookup auf die TopicConnectionFactory fehl. (Während vorher schon das Lookup auf das Topic erfolgreich war.)
Der auftretende Fehler sieht wie folgt aus:
Caused by: com.ibm.websphere.naming.CannotInstantiateObjectException: Exception occurred while the JNDI NamingManager was processing a javax.naming.Reference object. [Root exception is java.lang.NoClassDefFoundError: Invalid Implementation Key, com.ibm.ws.transaction.NonRecovWSTxManager]
at com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookupExt(Helpers.java:952)
at com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookup(Helpers.java:701)
at com.ibm.ws.naming.jndicos.CNContextImpl.processResolveResults(CNContextImpl.java:1937)
at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1792)
at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1707)
at com.ibm.ws.naming.jndicos.CNContextImpl.lookupExt(CNContextImpl.java:1412)
at com.ibm.ws.naming.jndicos.CNContextImpl.lookup(CNContextImpl.java:1290)
at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:145)
at javax.naming.InitialContext.lookup(Unknown Source)
at de.cat.lib.serveraccess.jndi.JNDIAccessor.lookup(JNDIAccessor.java:184)
... 2 more
Caused by: java.lang.NoClassDefFoundError: Invalid Implementation Key, com.ibm.ws.transaction.NonRecovWSTxManager
at com.ibm.ws.Transaction.TransactionManagerFactory.getUOWCurrent(TransactionManagerFactory.java:109)
at com.ibm.ws.rsadapter.AdapterUtil.<clinit>(AdapterUtil.java:125)
at com.ibm.ejs.j2c.ConnectionFactoryBuilderImpl.getObjectInstance(ConnectionFactoryBuilderImpl.java:274)
at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
at com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookupExt(Helpers.java:894)
... 11 more



Googeln und Forschen brachte mich soweit, dass ich die "com.ibm.ws.webservices.thinclient_6.1.0.jar" einbinden solle, ist sie aber natürlich schon drin. Zudem sind "sibc.jms.jar", "sibc.jndi.jar" und "sibc.orb.jar" im Klassenpfad mit hinterlegt.
Die Jars sind auch im Falle eines Zzugriffs über die RCP Anwendung im Klassenpfad. (Sonst würde ja die Sessionbean und der Topic-Zugriff auch schon fehl schlagen)

Ich konnte beobachten das der InitalContext, je nachdem ob ich meine Testklasse aus Eclise oder die RCP Anwendung starte eine, leicht abweichende Enviroment-Map hat.
Bei Eclipse-Testklassenstart steht "com.ibm.ws.naming.implementation=WsnIpCos" drin, der Eintrag fehlt im RCP Umfeld.

Hier der Code des InitContext-Erzeugens:
Code:
        Properties env = new Properties();

        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
        env.put("java.naming.corba.orb", org.omg.CORBA.ORB.init((String[]) null, null));
        env.put(Context.PROVIDER_URL, pProviderURL);
        InitialContext initialContext = new InitialContext(env);

Ich vermute die Ursache im Klassloader, wüsste aber nicht wie ich da wo was einstellen müsste. Im Grunde hätte diese Anfrage eventuell besser ins RCP Unterforum gepasst, dort geht es aber scheinbar ehr um GUI Fragen und weniger um die Tiefen des JNDI, Classloaders, etc. Verzeiht also bitte wenn ich die Frage nicht ganz korrekt eingeordnet habe.

Habt vielen Dank und ... ich freue mich auf Hinweise.

Thorsten
 
Moin Thorsten,
bei den Klassloadern habe ich auch noch so meine Probleme, aber den Zugriff auf die JNDI kannst du im Bezug auf die TopicConnectionFactory umgehen.
Es ist möglich sie die TopicConnectionFactory ohne JNDI-Lookup zu holen:)

Code:
JmsTopicConnectionFactory jmsCF = JmsFactoryFactory.getInstance().createTopicConnectionFactory();
jmsCF.setBusName("meinServiceIntegrationBus");
jmsCF.setProviderEndpoints("SERVER_IP:SIB_ENDPOINT_ADRESS");

Die SIB_ENDPOINT_ADRESS lautet üblicherweise 7276.

Schöne Grüße
Antje
 

Neue Beiträge

Zurück