Setup
Step 1. Grab a copy of JBoss AS 4.2.x+ or JBoss EAP 4.2.x/4.3.x+ and create a new server configuration (based on /default).
Step 2. Go to deploy/http-invoker.sar/invoker.war/WEB-INF/classes/ and ZIP up the classes into a JAR called jboss-http-naming.jar. Put this jar in the server's lib directory so that both the legacy and unified http invoker share these classes.
Server Side
Step 3. Within the deploy/ directory of the newly created configuration, create the following folder hierarchy:
deploy/ unified-http-invoker.sar/ unified-invoker.war/ WEB-INF/ META-INF/
Step 4. Within WEB-INF, create a file called web.xml that will contain the JNDI factory servlet definition. Note how underneath the JNDI factory there's a NamingFactoryServlet that will return a JNDI proxy that will be defined in the next step:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>JNDIFactory</servlet-name> <description>A servlet that exposes the JBoss JNDI Naming service stub through http. The return content is a serialized MarshalledValue containg the org.jnp.interfaces.Naming stub. This configuration handles requests for the standard JNDI naming service. </description> <servlet-class>org.jboss.invocation.http.servlet.NamingFactoryServlet</servlet-class> <init-param> <param-name>namingProxyMBean</param-name> <param-value>jboss:service=proxyfactory,type=unified,transport=servlet,target=naming</param-value> </init-param> <init-param> <param-name>proxyAttribute</param-name> <param-value>Proxy</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JNDIFactory</servlet-name> <url-pattern>/JNDIFactory/*</url-pattern> </servlet-mapping> </web-app>
Step 5. Within META-INF, create a file called jboss-service.xml that will contain:
JBoss Remoting MBean with Servlet as defined transport.
Unified Invoker MBean that will delegate to JBoss Remoting MBean.
Proxy to the JNDI Naming Service that uses the Unified Invoker underneath.
<?xml version="1.0" encoding="UTF-8"?>
<server>
<!-- Expose the Naming service interface via the UnifiedInvoker -->
<mbean code="org.jboss.invocation.jrmp.server.JRMPProxyFactory"
name="jboss:service=proxyfactory,type=unified,transport=servlet,target=naming">
<attribute name="InvokerName">jboss:service=invoker,type=unified,transport=servlet</attribute>
<attribute name="TargetName">jboss:service=Naming</attribute>
<attribute name="JndiName"></attribute>
<attribute name="ExportedInterface">org.jnp.interfaces.Naming</attribute>
<attribute name="ClientInterceptors">
<interceptors>
<interceptor>org.jboss.proxy.ClientMethodInterceptor</interceptor>
<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
<interceptor>org.jboss.naming.interceptors.ExceptionInterceptor</interceptor>
<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
</interceptors>
</attribute>
<depends>jboss:service=invoker,type=unified,transport=servlet</depends>
</mbean>
<!-- Unified invoker (based on remoting) -->
<mbean code="org.jboss.invocation.unified.server.UnifiedInvoker"
name="jboss:service=invoker,type=unified,transport=servlet">
<depends>jboss:service=TransactionManager</depends>
<depends>jboss.remoting:service=connector,transport=servlet</depends>
</mbean>
<mbean code="org.jboss.remoting.transport.Connector"
name="jboss.remoting:service=connector,transport=servlet"
display-name="Servlet transport Connector">
<attribute name="Configuration">
<config>
<invoker transport="servlet">
<attribute name="dataType" isParam="true">invocation</attribute>
<attribute name="marshaller" isParam="true">org.jboss.invocation.unified.marshall.InvocationMarshaller</attribute>
<attribute name="unmarshaller" isParam="true">org.jboss.invocation.unified.marshall.InvocationUnMarshaller</attribute>
<attribute name="serverBindAddress">${jboss.bind.address}</attribute>
<attribute name="serverBindPort">8080</attribute>
<attribute name="path">unified-invoker/ServerInvokerServlet</attribute>
</invoker>
<handlers>
<handler subsystem="invoker">jboss:service=invoker,type=unified,transport=servlet</handler>
</handlers>
</config>
</attribute>
</mbean>
</server>
Deployment Archive
No changes required here.
Client Side
Step 6. Retrieve the JNDI proxy via the HTTP, do the lookup and call your EJB.
Properties p = new Properties();
p.put("java.naming.factory.initial", "org.jboss.naming.HttpNamingContextFactory");
p.put("java.naming.provider.url", "http://localhost:8080/unified-invoker/JNDIFactory");
p.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
ctx = new InitialContext(p);
TimeTellerHome home = (TimeTellerHome)ctx.lookup("ejb/MyEjb");
TimeTeller teller = home.create();
System.out.println(teller.whatsTheTime());
Referenced by:
Comments