Is it possible to selectively access EJBs on multiple EAP6 servers from a remote EAP6 client server?
quadrone Jan 22, 2016 7:12 PMI have EJBs deployed in an ear that is deployed on multiple EAP 6.4 servers. Using the setup provided by EJB invocations from a Remote Server I am able to access EJBs, but the server upon which access is granted is random (I've since read that this is the default behavior). I tried to implement a scoped context following the example given at CustomScopedEJBContextSelector, but I'm getting an Error that says: EJB client context selector may not be changed. Is it possible to invoke an EJB on a server of my choosing in EAP 6.4? If so, is there configuration not mentioned in the article and example that I need to include? Or in the code below, is there an error I'm making?
Method that gets the remote Interface
public Object retrieveObjectJbossWay(Class<RemoteInterface> interfaceClazz, Class<RemoteBean> beanClazz, String hostIp, String hostPort) { final String beanName = beanClazz.getSimpleName(); final String viewClassName = interfaceClazz.getName(); Object ourInterface = null; try { ourInterface = ContextRegistrar.getContext() .lookup("ejb:" + appName + "/" + moduleName + "/" + beanName + "!" + viewClassName); ContextRegistrar.registerScope(hostIp, hostPort); ContextRegistrar.getSelector().setScope(hostIp + hostPort); } catch (NamingException e) { log.error("While trying to get context..." + e.toString() + StringUtil.loggableStackTrace(e)); } return ourInterface; }
Class for setting up custom selector and registering scoped context
public class ContextRegistrar { private static final Context context; private static final CustomScopeEJBClientContextSelector selector = new CustomScopeEJBClientContextSelector(); static { System.out.println("Inside ContextRegistrator static block..."); Hashtable<String, String> p = new Hashtable<String, String>(); p.put(InitialContext.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); try { context = new InitialContext(p); } catch (NamingException e) { throw new RuntimeException("Could not create InitialContext!", e); } EJBClientContext.setSelector(selector); System.out.println("The Custom selector was set"); } public static void registerScope(String host, String port) { Properties p = new Properties(); p.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false"); p.put("remote.connections", "default"); p.put("remote.connection.default.port", port); p.put("remote.connection.default.host", host); p.put("remote.connection.default.username", "ejbuser"); p.put("remote.connection.default.password", "ejbP@ssw0rd"); selector.registerEJBClientContext(host+port, p); } public static Context getContext() { return context; } public static CustomScopeEJBClientContextSelector getSelector() { return selector; } }
The following exception is thrown at line 18 in the ContextRegistrar above:
2016-01-22 16:34:20,310 SEVERE [com.vaadin.server.DefaultErrorHandler] (http-127.0.0.1/127.0.0.1:40000-2) : java.lang.ExceptionInInitializerError
at com.csg.mpgconsole.utils.RemoteObjectRetriever.retrieveObjectJbossWay(RemoteObjectRetriever.java:135) [classes:]
at com.csg.mpgconsole.remote.callers.RefreshApplication.refreshProperties(RefreshApplication.java:45) [classes:]
at com.csg.mpgconsole.view.listeners.AppServerRefreshButtonClickListener.buttonClick(AppServerRefreshButtonClickListener.java:56) [classes:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_80]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_80]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_80]
at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_80]
at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:508) [vaadin-server-7.5.3.jar:7.5.3]
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:198) [vaadin-server-7.5.3.jar:7.5.3]
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:161) [vaadin-server-7.5.3.jar:7.5.3]
at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1003) [vaadin-server-7.5.3.jar:7.5.3]
at com.vaadin.ui.Button.fireClick(Button.java:393) [vaadin-server-7.5.3.jar:7.5.3]
at com.vaadin.ui.Button$1.click(Button.java:61) [vaadin-server-7.5.3.jar:7.5.3]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_80]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_80]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_80]
at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_80]
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158) [vaadin-server-7.5.3.jar:7.5.3]
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:118) [vaadin-server-7.5.3.jar:7.5.3]
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:313) [vaadin-server-7.5.3.jar:7.5.3]
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:202) [vaadin-server-7.5.3.jar:7.5.3]
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:95) [vaadin-server-7.5.3.jar:7.5.3]
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41) [vaadin-server-7.5.3.jar:7.5.3]
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1408) [vaadin-server-7.5.3.jar:7.5.3]
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:350) [vaadin-server-7.5.3.jar:7.5.3]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-2.jar:1.0.2.Final-redhat-2]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:150) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:854) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:926) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_80]
Caused by: java.lang.SecurityException: EJBCLIENT000021: EJB client context selector may not be changed
at org.jboss.ejb.client.EJBClientContext.setSelector(EJBClientContext.java:218) [jboss-ejb-client-1.0.30.Final-redhat-1.jar:1.0.30.Final-redhat-1]
at com.csg.mpgconsole.utils.ContextRegistrar.<clinit>(ContextRegistrar.java:38) [classes:]
... 39 more