I have an update that allows one to specify custom RMI socket factories
as part of the container-invoker-conf. An example usage is:
<!-- Override the default container socket factories -->
<container-invoker-conf>
<Optimized>true</Optimized>
<RMIObjectPort>4445</RMIObjectPort>
<RMIClientSocketFactory>org.jboss.test.jrmp.ejb.CompressionClientSocketFactory</RMIClientSocketFactory>
<RMIServerSocketFactory>org.jboss.test.jrmp.ejb.CompressionServerSocketFactory</RMIServerSocketFactory>
</container-invoker-conf>
It is actually a rather minor change to the current JRMPContainerInvoker class. The
cvs diff
is given below. Any objections to committing this?
server 733>cvs diff JRMPContainerInvoker.java
Index: JRMPContainerInvoker.java
===================================================================
RCS file: /products/cvs/ejboss/jboss/src/main/org/jboss/ejb/plugins/jrmp/server/
JRMPContainerInvoker.java,v
retrieving revision 1.35
diff -r1.35 JRMPContainerInvoker.java
18a19,20
> import java.rmi.server.RMIClientSocketFactory;
> import java.rmi.server.RMIServerSocketFactory;
90a93,96
> protected RMIClientSocketFactory csf;
> protected RMIServerSocketFactory ssf;
> protected String csfClassName;
> protected String ssfClassName;
133d138
<
254c259
< UnicastRemoteObject.exportObject(this, rmiPort);
---
> UnicastRemoteObject.exportObject(this, rmiPort, csf, ssf);
479,509c484,558
< // XmlLoadable implementation
< public void importXml(Element element) throws DeploymentException
< {
< String opt = MetaData.getElementContent(MetaData.getUniqueChild(element,
"Optimized"));
< optimize = Boolean.valueOf(opt).booleanValue();
<
< if ((System.getProperty("java.vm.version").compareTo("1.3") >= 0)) jdk12
2 = false;
< else jdk122 = true;
<
< // Create delegate depending on JDK version
< if (jdk122)
< {
< ciDelegate = new org.jboss.ejb.plugins.jrmp12.server.JRMPContainerInv
oker(this);
< } else
< {
< ciDelegate = new org.jboss.ejb.plugins.jrmp13.server.JRMPContainerInv
oker(this);
< }
<
< try
< {
< String port = MetaData.getElementContent(MetaData.getUniqueChild(elem
ent, "RMIObjectPort"));
< rmiPort = Integer.parseInt(port);
< } catch(NumberFormatException e)
< {
< rmiPort = ANONYMOUS_PORT;
< } catch(DeploymentException e)
< {
< rmiPort = ANONYMOUS_PORT;
< }
< Logger.debug("Container Invoker RMI Port='"+(rmiPort == ANONYMOUS_PORT ?
"Anonymous" : Integer.toString(rmiPort))+"'");
< Logger.debug("Container Invoker Optimize='"+optimize+"'");
---
> // XmlLoadable implementation
> public void importXml(Element element) throws DeploymentException
> {
> Element optElement = MetaData.getUniqueChild(element, "Optimized");
> if( optElement != null )
> {
> String opt = MetaData.getElementContent(optElement);
> optimize = Boolean.valueOf(opt).booleanValue();
> }
>
> if ((System.getProperty("java.vm.version").compareTo("1.3") >= 0))
> jdk122 = false;
> else
> jdk122 = true;
>
> // Create delegate depending on JDK version
> if (jdk122)
> {
> ciDelegate = new org.jboss.ejb.plugins.jrmp12.server.JRMPContainer
Invoker(this);
> }
> else
> {
> ciDelegate = new org.jboss.ejb.plugins.jrmp13.server.JRMPContainer
Invoker(this);
> }
>
> try
> {
> Element portElement = MetaData.getUniqueChild(element, "RMIObjectP
ort");
> if( portElement != null )
> {
> String port = MetaData.getElementContent(portElement);
> rmiPort = Integer.parseInt(port);
> }
> } catch(NumberFormatException e)
> {
> rmiPort = ANONYMOUS_PORT;
> } catch(DeploymentException e)
> {
> rmiPort = ANONYMOUS_PORT;
> }
>
> // Load any custom socket factories
> ClassLoader loader = Thread.currentThread().getContextClassLoader();
> try
> {
> Element csfElement = MetaData.getOptionalChild(element, "RMIClient
SocketFactory");
> if( csfElement != null )
> {
> csfClassName = MetaData.getElementContent(csfElement);
> }
> }
> catch(Exception e)
> {
> Logger.error(e);
> csf = null;
> }
> try
> {
> Element ssfElement = MetaData.getOptionalChild(element, "RMIServer
SocketFactory");
> if( ssfElement != null )
> {
> ssfClassName = MetaData.getElementContent(ssfElement);
> }
> }
> catch(Exception e)
> {
> Logger.error(e);
> ssf = null;
> }
> loadCustomSocketFactories(loader);
>
> Logger.debug("Container Invoker RMI Port='"+(rmiPort == ANONYMOUS_PORT
? "Anonymous" : Integer.toString(rmiPort))+"'");
> Logger.debug("Container Invoker Client SocketFactory='"+(csf == null ?
"Default" : csf.toString())+"'");
> Logger.debug("Container Invoker Server SocketFactory='"+(ssf == null ?
"Default" : ssf.toString())+"'");
> Logger.debug("Container Invoker Optimize='"+optimize+"'");
538a588,616
> private void loadCustomSocketFactories(ClassLoader loader)
> {
> try
> {
> if( csfClassName != null )
> {
> Class csfClass = loader.loadClass(csfClassName);
> csf = (RMIClientSocketFactory) csfClass.newInstance();
> }
> }
> catch(Exception e)
> {
> Logger.error(e);
> csf = null;
> }
> try
> {
> if( ssfClassName != null )
> {
> Class ssfClass = loader.loadClass(ssfClassName);
> ssf = (RMIServerSocketFactory) ssfClass.newInstance();
> }
> }
> catch(Exception e)
> {
> Logger.error(e);
> ssf = null;
> }
> }