Remote EJB invocation failure - client and server on same machine
sanssan Feb 1, 2013 7:46 AMHi,
I do have strange issue now.
Above example worked excellent with me when client is on another server.
There are 3 instances JBoss 7.1.1 @ MyAPPSERVER_01 and 3 instances of JBoss 7.1.1.Final @ MyWEBSERVER_01.
Above mentioned EJB call from JBossInstance_01 @ MyWEBSERVER_01 to JBossInstance_01 @ MyAPPSERVER_01, working good.
But from JBossInstance_02 @ MyAPPSERVER_01 to JBossInstance_01 @ MyAPPSERVER_01
Both EJB Client shares the same code....
Client Lookup Code
final Hashtable<String, Object> jndiProperties = new Hashtable<String, Object>(); jndiProperties.put(Context.URL_PKG_PREFIXES, JNDINames.JBOSS_CLIENT_NAMING_PREFIX); InitialContext iContext = new InitialContext(jndiProperties); Object obj = iContext.lookup(name);
jboss-ejb-client.xml
<jboss-ejb-client xmlns="urn:jboss:ejb-client:1.0"> <client-context> <ejb-receivers> <remoting-ejb-receiver outbound-connection-ref="remote-ejb-connection"/> </ejb-receivers> </client-context> </jboss-ejb-client>
standalone.xml
<management>
<security-realms>
.............
<security-realm name="ejb-security-realm">
<server-identities>
<secret value="dGVzdA=="/>
</server-identities>
</security-realm>
</security-realms>
.............
</management>
.............
<profile>
.............
<subsystem xmlns="urn:jboss:domain:ejb3:1.2">
<session-bean>
<stateless>
<bean-instance-pool-ref pool-name="slsb-strict-max-pool"/>
</stateless>
<stateful default-access-timeout="5000" cache-ref="simple"/>
<singleton default-access-timeout="5000"/>
</session-bean>
<mdb>
<resource-adapter-ref resource-adapter-name="hornetq-ra"/>
<bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
</mdb>
<pools>
<bean-instance-pools>
<strict-max-pool name="slsb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/>
<strict-max-pool name="mdb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/>
</bean-instance-pools>
</pools>
<caches>
<cache name="simple" aliases="NoPassivationCache"/>
<cache name="passivating" passivation-store-ref="file" aliases="SimpleStatefulCache"/>
</caches>
<passivation-stores>
<file-passivation-store name="file"/>
</passivation-stores>
<async thread-pool-name="default"/>
<timer-service thread-pool-name="default">
<data-store path="timer-service-data" relative-to="jboss.server.data.dir"/>
</timer-service>
<remote connector-ref="remoting-connector" thread-pool-name="default"/>
<thread-pools>
<thread-pool name="default">
<max-threads count="10"/>
<keepalive-time time="100" unit="milliseconds"/>
</thread-pool>
</thread-pools>
</subsystem>
.............
<subsystem xmlns="urn:jboss:domain:remoting:1.1">
<connector name="remoting-connector" socket-binding="remoting" security-realm="ApplicationRealm"/>
<outbound-connections>
<remote-outbound-connection name="remote-ejb-connection" outbound-socket-binding-ref="remote-ejb" username="ejbuser" security-realm="ejb-security-realm">
<properties>
<property name="SASL_POLICY_NOANONYMOUS" value="false"/>
<property name="SSL_ENABLED" value="false"/>
</properties>
</remote-outbound-connection>
</outbound-connections>
</subsystem>
.............
</profile>
.............
<socket-binding-group name="standard-sockets" default-interface="any" port-offset="${jboss.socket.binding.port-offset:0}">
<socket-binding name="management-native" interface="management" port="${jboss.management.native.port:6992}"/>
<socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9988}"/>
<socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9446}"/>
<socket-binding name="ajp" port="8012"/>
<socket-binding name="https" port="8446"/>
<socket-binding name="osgi-http" interface="management" port="8192"/>
<socket-binding name="remoting" port="4453"/>
<socket-binding name="txn-recovery-environment" port="4737"/>
<socket-binding name="txn-status-manager" port="4727"/>
<socket-binding name="messaging" port="5445"/>
<socket-binding name="messaging-throughput" port="5455"/>
<outbound-socket-binding name="mail-smtp">
<remote-destination host="localhost" port="25"/>
</outbound-socket-binding>
<outbound-socket-binding name="remote-ejb">
<remote-destination host="JBossInstance_01" port="4451"/>
</outbound-socket-binding>
</socket-binding-group>
But, failing with error:
java.lang.IllegalStateException: No EJB receiver available for handling [appName:quote,modulename:quote.jar,distinctname:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@4a664d41 at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:584) at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:119) at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181) at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:136) at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:121) at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:104) at $Proxy16.isAlive(Unknown Source) at com.xyz.life.externalservice.services.AQuoteService.isServiceReachable(AQuoteService.java:492) at com.xyz.life.externalservice.common.component.manager.StartupService.start(StartupService.java:39) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.jboss.as.service.AbstractService.invokeLifecycleMethod(AbstractService.java:52) at org.jboss.as.service.StartStopService.start(StartStopService.java:54) at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722)
This is the error for all following EJB Lookups!
LOOKUP Name : ejb:global/quote/quote.jar/WebServiceQuoteFacadeEJB!com.ge.life.annuity.service.ejb.WebServiceQuoteFacade
LOOKUP Obj : Proxy for remote EJB StatelessEJBLocator{appName='global', moduleName='quote', distinctName='quote.jar', beanName='WebServiceQuoteFacadeEJB', view='interface com.ge.life.annuity.service.ejb.WebServiceQuoteFacade'}
TEST LOOKUP EXCEPTION : java.lang.IllegalStateException: No EJB receiver available for handling [appName:global,modulename:quote,distinctname:quote.jar] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@709dea70
LOOKUP Name : ejb:app/quote.jar/WebServiceQuoteFacadeEJB!com.ge.life.annuity.service.ejb.WebServiceQuoteFacade
LOOKUP Obj : Proxy for remote EJB StatelessEJBLocator{appName='app', moduleName='quote.jar', distinctName='', beanName='WebServiceQuoteFacadeEJB', view='interface com.ge.life.annuity.service.ejb.WebServiceQuoteFacade'}
TEST LOOKUP EXCEPTION : java.lang.IllegalStateException: No EJB receiver available for handling [appName:app,modulename:quote.jar,distinctname:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@f8a98d3
LOOKUP Name : ejb:jboss/exported/quote/quote.jar/WebServiceQuoteFacadeEJB!com.ge.life.annuity.service.ejb.WebServiceQuoteFacade
LOOKUP Obj : Proxy for remote EJB StatelessEJBLocator{appName='jboss', moduleName='exported', distinctName='quote', beanName='quote.jar/WebServiceQuoteFacadeEJB', view='interface com.ge.life.annuity.service.ejb.WebServiceQuoteFacade'}
TEST LOOKUP EXCEPTION : java.lang.IllegalStateException: No EJB receiver available for handling [appName:jboss,modulename:exported,distinctname:quote] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@7a87029c
LOOKUP Name : ejb:quote/quote.jar//QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade
LOOKUP Obj : Proxy for remote EJB StatelessEJBLocator{appName='quote', moduleName='quote.jar', distinctName='', beanName='QuoteFacadeEJB', view='interface com.ge.life.annuity.service.ejb.QuoteFacade'}
TEST LOOKUP EXCEPTION : java.lang.IllegalStateException: No EJB receiver available for handling [appName:quote,modulename:quote.jar,distinctname:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@7601356
LOOKUP Name : ejb:quote/quote.jar//WebServiceQuoteFacadeEJB!com.ge.life.annuity.service.ejb.WebServiceQuoteFacade
LOOKUP Obj : Proxy for remote EJB StatelessEJBLocator{appName='quote', moduleName='quote.jar', distinctName='', beanName='WebServiceQuoteFacadeEJB', view='interface com.ge.life.annuity.service.ejb.WebServiceQuoteFacade'}
TEST LOOKUP EXCEPTION : java.lang.IllegalStateException: No EJB receiver available for handling [appName:quote,modulename:quote.jar,distinctname:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@349576e2
But, same lookup working well from WEB Server. Why it is not working from APP Server?
Only differnce between
JBossInstance_01 @ MyWEBSERVER_01 (EJB Client call working) and JBossInstance_02 @ MyAPPSERVER_01 (EJB Client call not working) is MDB configuration is added to JBossInstance_02 @ MyAPPSERVER_01 server where JBossInstance_01 @ MyWEBSERVER_01 is not having MDB configuration.
Would it affect the client?
In
<outbound-socket-binding name="remote-ejb"> <remote-destination host="JBossInstance_01" port="4451"/> </outbound-socket-binding>
I tried, localhost, HOSTNAME, IP Address, 127.0.0.1 (IP address for localhost).... But, all fails with same error.