Let me explain what I'm trying to do: 

I have a resource adapter which does EIS specific stuff (it creates an Object, 
registers callbacks with a EIS written in C++ client using JNI, awaits for 
callbacks from the C++ EIS). 

When the message arrrives, the C++ client invokes the callback on the same 
object. The object then submits the message to MessageEndpoint (MDB) fetched 
from the MessageEndpointFactory. 

Currently (for testing purposes), the MDB's listener callback doesn't have any 
implementation except printing out that the message is received. 

Now, when a message is arrived(that is, a callback is invoked from the C++ 
client), the enpoint is created (if not already created) and the listener 
message is invoked: 
 
  |     endpointListener.onMessage(event);
  | 
I get a NullPointerException: 
 
  | 2006-09-27 12:54:23,643 TRACE [org.jboss.invocation.local.LocalInvoker] 
Failed to invoke on mbean: j
  | boss.j2ee:jndiName=MyLocalFlowMDB,service=EJB
  | java.lang.NullPointerException
  |     at org.jboss.ejb.Container.invoke(Container.java:825)
  |     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:585)
  |     at 
org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:141)
  |     at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)
  |     at org.jboss.mx.server.Invocation.invoke(Invocation.java:72)
  |     at 
org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:245)
  |     at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:644)
  |     at 
org.jboss.invocation.local.LocalInvoker$MBeanServerAction.run(LocalInvoker.java:144)
  |     at java.security.AccessController.doPrivileged(Native Method)
  |     at 
org.jboss.invocation.local.LocalInvoker$MBeanServerAction.invoke(LocalInvoker.java:163)
  |     at org.jboss.invocation.local.LocalInvoker.invoke(LocalInvoker.java:104)
  |     at 
org.jboss.invocation.InvokerInterceptor.invokeLocal(InvokerInterceptor.java:179)
  |     at 
org.jboss.invocation.InvokerInterceptor.invoke(InvokerInterceptor.java:165)
  |     at 
org.jboss.proxy.TransactionInterceptor.invoke(TransactionInterceptor.java:46)
  |     at 
org.jboss.ejb.plugins.inflow.MessageEndpointInterceptor.delivery(MessageEndpointInterceptor.java
  | :237)
  |     at 
org.jboss.ejb.plugins.inflow.MessageEndpointInterceptor.invoke(MessageEndpointInterceptor.java:1
  | 17)
  |     at 
org.jboss.proxy.ClientMethodInterceptor.invoke(ClientMethodInterceptor.java:59)
  |     at org.jboss.proxy.ClientContainer.invoke(ClientContainer.java:86)
  |     at $Proxy61.onMessage(Unknown Source)
  |     at 
com.cmi2.pats.source.connector.PatsJNIWorker.patsPushEvent(PatsJNIWorker.java:303)
  |     at 
com.cmi2.pats.source.connector.PatsJNIWorker.testEvent(PatsJNIWorker.java:485)
  |     at 
com.cmi2.pats.source.connector.PatsJNIWorker.javaHandleEODEvent(PatsJNIWorker.java:412)
  | 2006-09-27 12:54:23,643 TRACE 
[org.jboss.ejb.plugins.inflow.MessageEndpointInterceptor] MessageEndpo
  | int [EMAIL PROTECTED] delivery error
  |  

When I dig the code, it seems that a method (invoke) in the 
org.jboss.ejb.Container.java is throwing this exception(see line decorated in 
blue): 
 
  | public Object invoke(Invocation mi)
  |            throws Exception
  |    {
  |       ClassLoader callerClassLoader = 
SecurityActions.getContextClassLoader();
  |       long start = System.currentTimeMillis();
  |       Method m = null;
  | 
  |       boolean setCl = false;
  |       Object type = null;
  |       String contextID = getJaccContextID();
  |       try
  |       {
  |           if (!callerClassLoader.equals(classLoader))
  |          {
  |             setCl = true;
  |             SecurityActions.setContextClassLoader(this.classLoader);
  |          }
  |  

When I debug the session, the callerClassLoader is null hence NPE when compared 
with the existing DelegatingClassLoader. 

Interesting scenario is - when I send a test message(before the callback occurs 
on the Obejct from c++ client), it all works perfect (I found that the 
callerClassLoader is UCL3 during my debug session). However, when the message 
is obtained via callback, the callerClassLoader is null. (and hence falling 
flat over the equal block). 

What is that I am doing wrong? I have tried using the java 2 securtiy manager 
and security.policy, but couldn't succeed. 

However, when I did the following hack, it all went fine: 

 
  | // check whether the caller's cl is null to avoid NPE
  | if (callerClassLoader != null)
  | {
  |        if (!callerClassLoader.equals(classLoader))
  |        {
  |           setCl = true;
  |           SecurityActions.setContextClassLoader(this.classLoader);
  |        }
  | }
  | else
  | {
  |      // caller's cl is null, hence set the delegating cl loader of this 
class
  |       setCl = true;
  |       SecurityActions.setContextClassLoader(this.classLoader);
  | }
  | ..
  | }
  |      
  |  

I'll appreciate if anyone can throw somelight on this subject. 

PS: I was not quite sure where to post this message to. Let me know if it's 
wrong forum. 

Thanks 
Madhu

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3974793#3974793

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3974793
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to