remote ejb lookup from servlet doesn't work (no ejb receiver available)
superalex Oct 13, 2014 5:44 AMhi, i have two running jboss eap 6.1. One is back end with session bean and db query, the other is the front end with a simple servlet.
I have configured both jboss to support remote connection (i'm using also in other project so i know how to do it), but i have problems doing lookup from servlet.
The client project is a dynamic web project with a servlet and a web service. Running same lookup code form a web method in web service and doPost in servlet results in different output: web method runs well and calls the remote bean,doPost throws no ejb receiver available for handling exception. I don't know why servlet doesn't like remote lookups.
FRONT END standalone.xml
<remote-outbound-connection name="remote-ejb-connection3" outbound-socket-binding-ref="remote-ejb" username="remoteUser" security-realm="ejb-security-realm"> <properties> <property name="SASL_POLICY_NOANONYMOUS" value="false"/> <property name="SSL_ENABLED" value="false"/> </properties> </remote-outbound-connection>
<outbound-socket-binding name="remote-ejb"> <remote-destination host="192.168.30.78" port="4445"/> </outbound-socket-binding>
FRONT END jboss-ejb-client.xml
<?xml version="1.0" encoding="UTF-8"?> <jboss-ejb-client xmlns="urn:jboss:ejb-client:1.0"> <client-context> <ejb-receivers> <remoting-ejb-receiver outbound-connection-ref="remote-ejb-connection3"/> </ejb-receivers> </client-context> </jboss-ejb-client>
WEB METHOD CODE (IT WORKS)
@WebService(name = "ProvaService")
public class ProvaService {
@WebMethod
@WebResult(name = "prova")
public String prova() {
String ret = "OK";
try {
Utility.getInstance().initContext();
} catch (Exception e1) {
ret = "KO 1";
e1.printStackTrace();
}
try {
Utility.getInstance().getBean().insertDevice(new ArrayList<Device>());
} catch (Exception e) {
ret = "KO 2";
e.printStackTrace();
}
return ret;
}
}
SERVLET CODE (FAILS)
@WebServlet("/ProvaServlet")
public class ProvaServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ProvaServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("CHIAMATA SERVLET GET");
PrintWriter out = response.getWriter();
out.write("Hi GET");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
@SuppressWarnings("unchecked")
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("CHIAMATA SERVLET POST");
PrintWriter out = response.getWriter();
try {
Utility.getInstance().initContext();
} catch (Exception e1) {
ret = "KO 1";
e1.printStackTrace();
}
try {
Utility.getInstance().getBean().insertDevice(new ArrayList<Device>());
} catch (Exception e) {
ret = "KO 2";
e.printStackTrace();
}
out.write("Hi POST");
}
}
STACK TRACE
11:17:10,426 INFO [stdout] (http-/192.168.30.78:8080-1) CHIAMATA SERVLET POST 11:17:10,450 ERROR [stderr] (http-/192.168.30.78:8080-1) java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:, moduleName:ProvaTelecomBackEnd, distinctName:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@7af859ab 11:17:10,451 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:727) 11:17:10,452 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:116) 11:17:10,475 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:183) 11:17:10,476 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.jboss.ejb.client.EJBInvocationHandler.sendRequestWithPossibleRetries(EJBInvocationHandler.java:253) 11:17:10,541 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:198) 11:17:10,541 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:181) 11:17:10,542 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:144) 11:17:10,542 ERROR [stderr] (http-/192.168.30.78:8080-1) at com.sun.proxy.$Proxy75.insertDevice(Unknown Source) 11:17:10,542 ERROR [stderr] (http-/192.168.30.78:8080-1) at main.ProvaServlet.doPost(ProvaServlet.java:207) 11:17:10,543 ERROR [stderr] (http-/192.168.30.78:8080-1) at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) 11:17:10,543 ERROR [stderr] (http-/192.168.30.78:8080-1) at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 11:17:10,543 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) 11:17:10,565 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 11:17:10,581 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) 11:17:10,636 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) 11:17:10,667 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) 11:17:10,702 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) 11:17:10,706 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) 11:17:10,733 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) 11:17:10,738 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336) 11:17:10,766 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) 11:17:10,776 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) 11:17:10,781 ERROR [stderr] (http-/192.168.30.78:8080-1) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920) 11:17:10,803 ERROR [stderr] (http-/192.168.30.78:8080-1) at java.lang.Thread.run(Thread.java:724)
BACK END DEPLOY
09:58:54,253 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-3) JNDI bindings for session bean named Bean in deployment unit deployment "ProvaTelecomBackEnd.jar" are as follows: java:global/ProvaTelecomBackEnd/Bean!bean.RemoteBean java:app/ProvaTelecomBackEnd/Bean!bean.RemoteBean java:module/Bean!bean.RemoteBean java:jboss/exported/ProvaTelecomBackEnd/Bean!bean.RemoteBean java:global/ProvaTelecomBackEnd/Bean java:app/ProvaTelecomBackEnd/Bean java:module/Bean
UTILITY.JAVA
public class Utility {
private Context context = null;
private static Utility instance = null;
private RemoteBean gestore = null;
public static Utility getInstance() {
if (instance == null)
instance = new Utility();
return instance;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public void initContext() throws Exception {
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
if (context == null)
context = new InitialContext(jndiProperties);
}
public void closeContext() {
try {
this.context.close();
} catch (NamingException e) {
e.printStackTrace();
}
}
public RemoteBean getBean() throws Exception {
if (gestore == null)
gestore = (RemoteBean) context.lookup("ejb:/ProvaTelecomBackEnd//Bean!bean.RemoteBean");
return gestore;
}
}
I tried some modifications of lookup but nothing changed. Strange thing is that errors came up when i call the remote method insertDevice, initcontext and getBean seems to works.
any solution??