# EJB to EJB call



## Hansa (18. Jul 2011)

Hallo,

ich suche jetzt schon seit einer Weile nach einer Lösung für mein Problem und komme einfach nicht weiter.
Ich habe zwei VMs mit Glassfish3.1 laufen und eine EJB(ejbA, ejbB) auf je einer dieser VMs deployed.
Ich kann mit Hilfe der portable-jndi-names beide EJBs von einem Client aus aufrufen.


```
// Call to EJB on the same Host	- ip : 192.168.56.110	
InitialContext ic110 = new InitialContext();
SimpleARemote simpleA = (SimpleARemote)ic110.lookup("java:global/SimpleA/SimpleA!sa.SimpleARemote");
			
System.out.println("Local call : \n"+simpleA.aHello("User")+ "\n");
System.out.println("================================================ \n");
			
// Call to EJB on the remote Host - ip : 192.168.56.101
Properties props = new Properties();
String port = "3700";
String urlName = "192.168.56.101";
			props.setProperty("java.naming.factory.initial","com.sun.enterprise.naming.SerialInitContextFactory");  
			props.setProperty("java.naming.factory.url.pkgs","com.sun.enterprise.naming");
			props.setProperty("org.omg.CORBA.ORBInitialHost", urlName);  
			props.setProperty("org.omg.CORBA.ORBInitialPort",port);				
			InitialContext ic101 = new InitialContext(props);
			SimpleBRemote simpleB = (SimpleBRemote)ic101.lookup("java:global/SimpleB/SimpleB!sb.SimpleBRemote");
```

Wenn ich jedoch einen Call von ejbA zu ejbB machen möchte mit den gleichen Einstellungen wie der obige remote call, dann erhalte ich eine NamingException.


```
javax.naming.NamingException: Lookup failed for 'java:global/SimpleB/SimpleB!sb.SimpleBRemote' in SerialContext[myEnv={org.omg.CORBA.ORBInitialPort=3700, java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory, org.omg.CORBA.ORBInitialHost=192.168.56.101, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NamingException: ejb ref resolution error for remote business interfacesb.SimpleBRemote [Root exception is java.lang.ClassNotFoundException: sb.SimpleBRemote]]
	at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518)
	at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)
	at javax.naming.InitialContext.lookup(InitialContext.java:392)
	at javax.naming.InitialContext.lookup(InitialContext.java:392)
	at sa.SimpleA.callB(SimpleA.java:36)
	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 org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
	at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
	at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5367)
	at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
	at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:801)
	at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
	at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
	at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
	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 com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:862)
	at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:801)
	at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:371)
	at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5339)
	at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5327)
	at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:206)
	at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:79)
	at $Proxy332.callB(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 com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:144)
	at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:174)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:528)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:199)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1624)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1486)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:990)
	at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:214)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:742)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:539)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2324)
	at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
	at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)
Caused by: javax.naming.NamingException: ejb ref resolution error for remote business interfacesb.SimpleBRemote [Root exception is java.lang.ClassNotFoundException: sb.SimpleBRemote]
	at com.sun.ejb.EJBUtils.lookupRemote30BusinessObject(EJBUtils.java:434)
	at com.sun.ejb.containers.RemoteBusinessObjectFactory.getObjectInstance(RemoteBusinessObjectFactory.java:75)
	at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
	at com.sun.enterprise.naming.impl.SerialContext.getObjectInstance(SerialContext.java:556)
	at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:514)
	... 45 more
Caused by: java.lang.ClassNotFoundException: sb.SimpleBRemote
	at com.sun.enterprise.loader.ASURLClassLoader.findClassData(ASURLClassLoader.java:808)
	at com.sun.enterprise.loader.ASURLClassLoader.findClass(ASURLClassLoader.java:696)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	at com.sun.ejb.EJBUtils.getBusinessIntfClassLoader(EJBUtils.java:688)
	at com.sun.ejb.EJBUtils.loadGeneratedRemoteBusinessClasses(EJBUtils.java:463)
	at com.sun.ejb.EJBUtils.lookupRemote30BusinessObject(EJBUtils.java:414)
	... 49 more
```

Der EJB zu EJB  : 

```
Properties p = new Properties();
				String port = "3700";
		    	String urlName = "192.168.56.101";
				p.setProperty("java.naming.factory.initial","com.sun.enterprise.naming.SerialInitContextFactory");  
				p.setProperty("java.naming.factory.url.pkgs","com.sun.enterprise.naming");
				p.setProperty("org.omg.CORBA.ORBInitialHost", urlName);  
				p.setProperty("org.omg.CORBA.ORBInitialPort",port);	
				
				InitialContext ic = new InitialContext(p);
				SimpleBRemote simpleB = (SimpleBRemote)ic.lookup("java:global/SimpleB/SimpleB!sb.SimpleBRemote");
				return simpleB.bHello(name);
```
Ich wüsste gerne was ich hierbei falsch mache.


----------



## FArt (19. Jul 2011)

Vermutung: das Remote Interface des Beans ist in dem einem Server nicht deployt.


----------



## Hansa (19. Jul 2011)

Deine Vermutung ist richtig. Mir war nicht klar, dass das notwendig ist.
Das hieße ja man benötigt immer das Remote Interface eines EJBs, das man nutzen möchte ?
Wie muss/kann man es denn deployen ?
Muss das Remote Interface mit in die Jar für das ejbA(das EJB das den Aufruf auf ein externes macht) ?


----------



## FArt (19. Jul 2011)

Natürlich müssen alle Ressourcen für einen Zugriff auf das Bean über den Classloader vom Caller geladen werden könnne. Das ist z.B. das Remoteinterface, aber auch alle Klassen, die in der Signatur der Methoden vorkommen oder anderweitig über die Leitung gehen können.


----------



## Hansa (29. Jul 2011)

Schlussendlich habe ich die Ursache doch gefunden : 

Die VMs hatten unterschiedliche Netzwerkschnittstellen und in der Hostdatei(/etc/hosts) 
war der Hostname der VMs auf die WAN-IP und nicht auf die LAN-IP gebunden.
Somit führte die Antwort-IP zu einem unerwünschten Ziel.


----------

