[jboss-as7-dev] Remote JNDI lookup from the messaging subsystem

Jeff Mesnil jmesnil at redhat.com
Tue May 22 12:14:43 EDT 2012


Hi,

I'm working on a task to add managed JMS bridges to AS7 and needs some 
help with modules loading and dependencies.

A JMS bridge is a piece of code provided by HornetQ that allows to 
consume messages from one "source" broker (often a legacy or proprietary 
broker) to another "target" broker (e.g. HornetQ).
It is completely separated from HornetQ JMS implementation and relies 
only on JavaEE APIs (JNDI, JMS, JTA).

I got something working using the simplest case possible: both the 
source and target brokers are the AS7 instance where the JMS bridge is 
deployed. It's useless but it's a start :)

The 3 use cases that are useful are:
1. setup the source broker to be another AS7 instance
2. setup the source broker to be an older AS version (e.g. for updates)
3. setup the source broker to be *any other JMS implementation* (e.g. 
for migration)

I'm having some issues with the use cases dealing with JNDI setup and 
modules.

For all 3 use cases, the JMS bridge code (coming from HornetQ) 
instantiates a JNDI InitialContext with configurable properties to 
lookup the source and destination JMS resources.
I got it working when everything is in the same AS7 instance.

However, it doesn't when I am looking up from another AS7 instance using 
our JNDI remote: protocol. It's failing because  org.jboss.as.messaging 
is not able to load org.jboss.remote.naming classes. I added 
org.jboss.remote-naming to the messaging modules.xml but it is not 
enough. I now get a linkage error (cf at the end of my mail)

Basically my problem is do be able to do a remote JNDI lookup from 
inside an AS7 service. There is some documentation to do that for EJBs 
with outbound socket bindings[2]. I could make it work to lookup from 
another AS7 instance but it's not general enough. In real use case, the 
lookup will be to another broker (or an older AS version) with its own 
set of classes that needs to be isolated from the rest of the messaging 
service.

Does someone have a pointer that could help? Have we another AS7 service 
doing something similar?

btw, the documentation about modules[1] displays nothing: "Latest 
content for this page is not approved!"

thanks,
jeff


[1]: https://docs.jboss.org/author/display/MODULES/Specifying+dependencies
[2]: 
https://docs.jboss.org/author/display/AS71/EJB+invocations+from+a+remote+server+instance
The linkage error:


17:39:45,979 WARN  [org.jboss.modules] (MSC service thread 1-5) Failed 
to define class 
org.jboss.naming.remote.client.ejb.RemoteNamingEjbClientContextSelector 
in Module "org.jboss.remote-naming:main" from local module loader 
@851052d (roots: 
/home/jmesnil/Developer/jboss-as/build/target/jboss-as-7.2.0.Alpha1-SNAPSHOT/modules): 
java.lang.LinkageError: Failed to link 
org/jboss/naming/remote/client/ejb/RemoteNamingEjbClientContextSelector 
(Module "org.jboss.remote-naming:main" from local module loader @851052d 
(roots: 
/home/jmesnil/Developer/jboss-as/build/target/jboss-as-7.2.0.Alpha1-SNAPSHOT/modules))
         at 
org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:396)
         at 
org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:243)
         at 
org.jboss.modules.ModuleClassLoader$1.loadClassLocal(ModuleClassLoader.java:73)
         at org.jboss.modules.Module.loadModuleClass(Module.java:527)
         at 
org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:182)
         at 
org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
         at 
org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
         at 
org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
         at 
org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
         at 
org.jboss.naming.remote.client.InitialContextFactory.<clinit>(InitialContextFactory.java:118) 
[jboss-remote-naming-1.0.3.Final.jar:1.0.3.Final]
         at java.lang.Class.forName0(Native Method) [rt.jar:1.6.0_24]
         at java.lang.Class.forName(Class.java:264) [rt.jar:1.6.0_24]
         at 
org.jboss.as.naming.InitialContextFactoryBuilder.createInitialContextFactory(InitialContextFactoryBuilder.java:61) 
[jboss-as-naming-7.2.0.Alpha1-SNAPSHOT.jar:7.2.0.Alpha1-SNAPSHOT]
         at 
javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:681) 
[rt.jar:1.6.0_24]
         at 
javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:305) 
[rt.jar:1.6.0_24]
         at javax.naming.InitialContext.init(InitialContext.java:240) 
[rt.jar:1.6.0_24]
         at javax.naming.InitialContext.<init>(InitialContext.java:214) 
[rt.jar:1.6.0_24]
         at 
org.hornetq.jms.bridge.impl.JNDIFactorySupport.createObject(JNDIFactorySupport.java:55) 
[hornetq-jms-2.2.16.Final.jar:2.2.16.Final (HQ_2_2_16_FINAL, 122)]
         at 
org.hornetq.jms.bridge.impl.JNDIDestinationFactory.createDestination(JNDIDestinationFactory.java:40) 
[hornetq-jms-2.2.16.Final.jar:2.2.16.Final (HQ_2_2_16_FINAL, 122)]
         at 
org.hornetq.jms.bridge.impl.JMSBridgeImpl.setupJMSObjects(JMSBridgeImpl.java:1083) 
[hornetq-jms-2.2.16.Final.jar:2.2.16.Final (HQ_2_2_16_FINAL, 122)]
         at 
org.hornetq.jms.bridge.impl.JMSBridgeImpl.start(JMSBridgeImpl.java:348) 
[hornetq-jms-2.2.16.Final.jar:2.2.16.Final (HQ_2_2_16_FINAL, 122)]
         at 
org.jboss.as.messaging.jms.bridge.JMSBridgeService.start(JMSBridgeService.java:57) 
[jboss-as-messaging-7.2.0.Alpha1-SNAPSHOT.jar:7.2.0.Alpha1-SNAPSHOT]
         at 
org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) 
[jboss-msc-1.0.2.GA.jar:1.0.2.GA]
         at 
org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) 
[jboss-msc-1.0.2.GA.jar:1.0.2.GA]
         at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
[rt.jar:1.6.0_24]
         at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
[rt.jar:1.6.0_24]
         at java.lang.Thread.run(Thread.java:679) [rt.jar:1.6.0_24]
Caused by: java.lang.NoClassDefFoundError: 
org/jboss/ejb/client/ContextSelector
         at java.lang.ClassLoader.defineClass1(Native Method) 
[rt.jar:1.6.0_24]
         at java.lang.ClassLoader.defineClass(ClassLoader.java:634) 
[rt.jar:1.6.0_24]
         at 
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
[rt.jar:1.6.0_24]
         at 
org.jboss.modules.ModuleClassLoader.doDefineOrLoadClass(ModuleClassLoader.java:327)
         at 
org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:391)
         ... 26 more
Caused by: java.lang.ClassNotFoundException: 
org.jboss.ejb.client.ContextSelector from [Module 
"org.jboss.remote-naming:main" from local module loader @851052d (roots: 
/home/jmesnil/Developer/jboss-as/build/target/jboss-as-7.2.0.Alpha1-SNAPSHOT/modules)]
         at 
org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
         at 
org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
         at 
org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
         at 
org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:423)
         at 
org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:423)
         at 
org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
         at 
org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
         ... 31 more





-- 
Jeff Mesnil
JBoss, a division of Red Hat
http://jmesnil.net/


More information about the jboss-as7-dev mailing list