Running several JBoss AS on the same server

07 August 2007

Nicolas Leroux

by Nicolas Leroux

This article shows you how to run multiple JBoss Application servers on the same machine. This might be really useful if you wish to execute two different versions of the JBoss Application Server, or if you want to experiment with clustering. The main problem when running two or more instances of the JBoss Application server comes from the fact that the servers are using the same ports. Two solutions are presented: binding the JBoss Application Server to an interface and using the binding service manager.

Binding the JBoss Application Server to an interface

The easiest solution is to bind your application server to an interface. This easily done by starting your JBoss instance with the -b option.

For example:

# sh bin/run.sh -b 192.168.17.6
# sh bin/run.sh -b 192.168.17.7

However, this method requires multiple interfaces on the server, which might not always be the case. The other solution is to use the binding service manager for port/host mapping that JBoss provides.

Using the binding service manager

To deploy another instance of JBoss you need to change the ports that JBoss listens to. Here is a table of the ports you need to change:

Service Default port New Port Description

jboss.remoting:type=Connector,name=DefaultEjb3Connector,handler=ejb3

3873

3973

EJB3

jboss:service=Naming

1098

1198

JNDI

jboss:service=WebService

8083

8183

web service

jboss:service=invoker,type=jrmp

4444

4544

 

jboss:service=invoker,type=pooled

4445

4545

 

jboss:service=HAJNDI

1100,1101

1200,1201

HA JNDI / clusters

jboss:service=invoker,type=pooledha

4448

4548

clusters

jboss:service=CorbaORB

19001

19101

Corba

jboss.jmx:name=SnmpAgent,service=trapd,type=logger

1162

1262

SNMP

jboss.jmx:name=SnmpAgent,service=snmp,type=adaptor

1161

1261

SNMP

jboss.mq:service=InvocationLayer,type=UIL2

8093

8193

JMS

jboss.mq:service=InvocationLayer,type=HTTP

8080

8180

JMS HTTP

jboss.mq:service=JMSProviderLoader,name=HAJNDIJMSProvider

1100

1200

HA JMS

jboss.web:service=WebServer

8080,8443

8180, 8543

Http web server

jboss.messaging:service=Connector,transport=bisocket

4457

4557

JBoss Messaging

Of course, you probably do not have all of these services deployed on your Application Server.

The problem is that these ports are all defined in different files. Happily, the binding service manager lets you redefine these ports in one place.

The JBoss wiki explains it all. Here is a more detailed version on how to proceed.

Basically you can use the binding service manager. In order to do that, edit the file {jbossinstallationdirectory}/server/{instance}/conf/jboss-service.xml and find the ServiceBindingManager MBean.

The jboss-service.xml part we are interested by should look like this:

<!-- ==================================================================== -->
   <!-- Service Binding                                                      -->
   <!-- ==================================================================== -->

   <!--
      | Binding service manager for port/host mapping. This is a sample
      | config that demonstrates a JBoss instances with a server name 'ports-01'
      | loading its bindings from an XML file using the ServicesStoreFactory
      | implementation returned by the XMLServicesStoreFactory.
      |
      | ServerName: The unique name assigned to a JBoss server instance for
      | lookup purposes. This allows a single ServicesStore to handle mulitiple
      | JBoss servers.
      |
      | StoreURL: The URL string passed to org.jboss.services.binding.ServicesStore
      | during initialization that specifies how to connect to the bindings store.
      | StoreFactory: The org.jboss.services.binding.ServicesStoreFactory interface
      | implementation to create to obtain the ServicesStore instance. -->

   <mbean code="org.jboss.services.binding.ServiceBindingManager"

     name="jboss.system:service=ServiceBindingManager">
     <attribute name="ServerName">ports-01</attribute>
     <attribute name="StoreURL">${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml</attribute>
     <attribute name="StoreFactoryClassName">



       org.jboss.services.binding.XMLServicesStoreFactory
     </attribute>
   </mbean>

This refers to /docs/examples/binding-manager/sample-bindings.xml as an example. The example contains 4 different ports settings besides the default settings.

You can of course use your own configuration file.

Let’s create our own configuration file that we will call {jbossinstallationdirectory}/server/{instance}/conf/jboss-bindings.xml:

<service-bindings>
   <!-- ********************************************************** -->
   <!-- *                          ports-01                      * -->
   <!-- ********************************************************** -->

   <server name="ports-01">

      <!-- EJB3 Remoting Connector ejb3.deployer/META-INF/jboss-service.xml -->

      <service-config name="jboss.remoting:type=Connector,name=DefaultEjb3Connector,handler=ejb3"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">

        <delegate-config>
           <attribute name="InvokerLocator">socket://${jboss.bind.address}:3973</attribute>
        </delegate-config>
         <binding port="3973"/>

      </service-config>

      <!-- ********************* jboss-service.xml ****************** -->

      <service-config name="jboss:service=Naming"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config portName="Port" hostName="BindAddress">

            <attribute name="RmiPort">1198</attribute>
         </delegate-config>
         <binding port="1199" host="${jboss.bind.address}"/>

      </service-config>


      <service-config name="jboss:service=WebService"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config portName="Port"/>

         <binding port="8183"/>
      </service-config>


      <service-config name="jboss:service=invoker,type=jrmp"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">

         <delegate-config portName="RMIObjectPort"/>
         <binding port="4544"/>
      </service-config>

      <service-config name="jboss:service=invoker,type=pooled"

         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config portName="ServerBindPort"/>
         <binding port="4545"/>
      </service-config>

      <!-- ********************* cluster-service.xml **************** -->

      <service-config name="jboss:service=HAJNDI"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config portName="Port" hostName="BindAddress">

            <attribute name="RmiPort">1201</attribute>
         </delegate-config>
         <binding port="1200" host="${jboss.bind.address}"/>

      </service-config>

      <service-config name="jboss:service=invoker,type=jrmpha"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config portName="RMIObjectPort"/>

         <binding port="4544"/>
      </service-config>

      <service-config name="jboss:service=invoker,type=pooledha"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">

         <delegate-config portName="ServerBindPort"/>
         <binding port="4548"/>
      </service-config>

      <!-- ********************* iiop-service.xml ****************** -->

      <service-config name="jboss:service=CorbaORB"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config portName="Port"/>
         <binding port="3628"/>

      </service-config>

      <!-- ********************* jmx-rmi-adaptor.sar **************** -->

      <service-config name="jboss.jmx:type=Connector,name=RMI"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config portName="RMIObjectPort"/>

         <binding port="19101"/>
      </service-config>

      <!-- ********************* snmp-adaptor.sar ****************** -->

      <service-config name="jboss.jmx:name=SnmpAgent,service=trapd,type=logger"

         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config portName="Port"/>
         <binding port="1262"/>
      </service-config>

      <service-config name="jboss.jmx:name=SnmpAgent,service=snmp,type=adaptor"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config portName="Port"/>
         <binding port="1261"/>

      </service-config>

      <!-- ********************* jbossmq-service.xml **************** -->

      <!-- JMS related services -->
      <service-config name="jboss.mq:service=InvocationLayer,type=UIL2"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">

         <delegate-config portName="ServerBindPort"/>
         <binding port="8193"/>
      </service-config>


      <!-- ********************* jbossmq-httpil.sar **************** -->

      <service-config name="jboss.mq:service=InvocationLayer,type=HTTP"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config portName="URLPort"/>
         <binding port="8180"/>

      </service-config>

      <!-- ********************* hajndi-jms-ds.xml **************** -->

      <!-- The JMS provider loader -->
      <service-config name="jboss.mq:service=JMSProviderLoader,name=HAJNDIJMSProvider"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">

         <!--
              MAKE SURE java.naming.provider.url
              PORT IS SAME AS HA-JNDI ABOVE !!!
         -->
         <delegate-config>
            <attribute name="Properties"><![CDATA[
                java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
                java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
                java.naming.provider.url=${jboss.bind.address:localhost}:1200
                jnp.disableDiscovery=false
                jnp.partitionName=${jboss.partition.name:DefaultPartition}
                jnp.discoveryGroup=${jboss.partition.udpGroup:230.0.0.4}
                jnp.discoveryPort=1102
                jnp.discoveryTTL=16
                jnp.discoveryTimeout=5000
                jnp.maxRetries=1
           ]]>
           </attribute>
        </delegate-config>

        <!-- NOTE: YOU MUST ADD THIS ELEMENT, BUT THE VALUE DOESN'T MATTER
             BE SURE THE CORRECT VALUE IS IN java.naming.provider.url ABOVE -->
        <binding port="1200"/>
      </service-config>

      <!-- **************** http-invoker.sar & httpha-invoker.sar*************** -->

      <!-- EJBInvoker -->
      <service-config name="jboss:service=invoker,type=http"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config>
            <attribute name="InvokerURLSuffix">:${port}/invoker/EJBInvokerServlet</attribute>

        </delegate-config>
         <!--
            MUST BE THE SAME AS
            TOMCAT HTTP CONNECTOR BELOW !!!
             -->
         <binding port="8180"/>
      </service-config>
      <!-- JMXInvoker -->

      <service-config name="jboss:service=invoker,type=http,target=Naming"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config>
            <attribute name="InvokerURLSuffix">:${port}/invoker/JMXInvokerServlet</attribute>

        </delegate-config>
         <!--
            MUST BE THE SAME AS
            TOMCAT HTTP CONNECTOR BELOW !!!
             -->
         <binding port="8180"/>
      </service-config>

      <!-- readonly JMXInvoker -->

      <service-config name="jboss:service=invoker,type=http,target=Naming,readonly=true"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config>
            <attribute name="InvokerURLSuffix">:${port}/invoker/readonly/JMXInvokerServlet</attribute>

         </delegate-config>
         <!--
            MUST BE THE SAME AS
            TOMCAT HTTP CONNECTOR BELOW !!!
             -->
         <binding port="8180"/>
      </service-config>

      <!-- **************** httpha-invoker.sar*************** -->

      <!-- EJBInvokerHA -->
      <service-config name="jboss:service=invoker,type=httpHA"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config>
            <attribute name="InvokerURLSuffix">:${port}/invoker/EJBInvokerHAServlet</attribute>

        </delegate-config>
         <binding port="8180"/>
      </service-config>

      <!-- JMXInvokerHA -->
      <service-config name="jboss:service=invoker,type=http,target=HAJNDI"

         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config>
            <attribute name="InvokerURLSuffix">:${port}/invoker/JMXInvokerHAServlet</attribute>
        </delegate-config>
         <binding port="8180"/>

      </service-config>

      <!-- ********************* jboss-ws4ee.sar **************** -->

      <!-- Web Service related services -->
      <service-config name="jboss.ws4ee:service=AxisService"
         delegateClass="org.jboss.services.binding.AttributeMappingDelegate">

        <delegate-config portName="WebServicePort" hostName="WebServiceHost"/>
        <binding port="8180" host="${jboss.bind.address}"/>
      </service-config>

      <!-- ********************* remoting **************** -->

       <!-- *** remoting connector *** -->
       <service-config name="jboss.remoting:service=Connector,transport=socket"
          delegateClass="org.jboss.services.binding.XSLTConfigDelegate">
          <delegate-config>

             <xslt-config configName="Configuration"><![CDATA[
               <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>

                  <xsl:output method="xml" />

                  <xsl:param name="port"/>

                  <xsl:template match="/">
                     <xsl:apply-templates/>

                  </xsl:template>

                  <xsl:template match="attribute[@name='serverBindPort']">
                     <attribute type="java.lang.String" name="serverBindPort"><xsl:value-of select='$port'/></attribute>

                  </xsl:template>

                  <xsl:template match="*|@*">
                     <xsl:copy>
                        <xsl:apply-templates select="@*|node()"/>

                     </xsl:copy>
                  </xsl:template>
               </xsl:stylesheet>
          ]]>
          </xslt-config>

          </delegate-config>

      <!-- ********************* tomcat ********************** -->

      <service-config name="jboss.web:service=WebServer"
         delegateClass="org.jboss.services.binding.XSLTFileDelegate"
         >


         <delegate-config>
            <xslt-config configName="ConfigFile"><![CDATA[
   <xsl:stylesheet
         xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>

     <xsl:output method="xml" />

     <xsl:param name="port"/>

     <xsl:variable name="portAJP" select="$port - 71"/>

     <xsl:variable name="portHttps" select="$port + 363"/>

     <xsl:template match="/">

       <xsl:apply-templates/>
     </xsl:template>

      <xsl:template match = "Connector">
         <Connector>

            <xsl:for-each select="@*">
            <xsl:choose>
               <xsl:when test="(name() = 'port' and . = '8080')">
                  <xsl:attribute name="port"><xsl:value-of select="$port" /></xsl:attribute>

               </xsl:when>
               <xsl:when test="(name() = 'port' and . = '8009')">
                  <xsl:attribute name="port"><xsl:value-of select="$portAJP" /></xsl:attribute>

               </xsl:when>
               <xsl:when test="(name() = 'redirectPort')">
                  <xsl:attribute name="redirectPort"><xsl:value-of select="$portHttps" /></xsl:attribute>

               </xsl:when>
               <xsl:when test="(name() = 'port' and . = '8443')">
                  <xsl:attribute name="port"><xsl:value-of select="$portHttps" /></xsl:attribute>

               </xsl:when>
               <xsl:otherwise>
                  <xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>

               </xsl:otherwise>
            </xsl:choose>
            </xsl:for-each>
            <xsl:apply-templates/>
         </Connector>

      </xsl:template>

     <xsl:template match="*|@*">
       <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>

       </xsl:copy>
     </xsl:template>
   </xsl:stylesheet>
   ]]>
            </xslt-config>

         </delegate-config>

   <!-- ********************* jboss messaging ********************** -->

      <service-config name="jboss.messaging:service=Connector,transport=bisocket"
                      delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
         <delegate-config>

            <attribute name="Configuration"><![CDATA[
               <config>
                  <invoker transport="bisocket">
                     <attribute name="marshaller" isParam="true">org.jboss.jms.wireformat.JMSWireFormat</attribute>

                     <attribute name="unmarshaller" isParam="true">org.jboss.jms.wireformat.JMSWireFormat</attribute>
                     <attribute name="dataType" isParam="true">jms</attribute>

                     <attribute name="socket.check_connection" isParam="true">false</attribute>
                     <attribute name="timeout" isParam="true">0</attribute>

                     <attribute name="serverBindAddress">${jboss.bind.address}</attribute>
                     <attribute name="serverBindPort">4557</attribute>
                     <attribute name="leasePeriod">10000</attribute>

                     <attribute name="clientSocketClass" isParam="true">org.jboss.jms.client.remoting.ClientSocketWrapper</attribute>
                     <attribute name="serverSocketClass">org.jboss.jms.server.remoting.ServerSocketWrapper</attribute>
                     <attribute name="numberOfRetries" isParam="true">1</attribute>

                     <attribute name="numberOfCallRetries" isParam="true">1</attribute>
                     <attribute name="clientMaxPoolSize" isParam="true">50</attribute>

                  </invoker>
                 <handlers>
                    <handler subsystem="JMS">org.jboss.jms.server.remoting.JMSServerInvocationHandler</handler>
                 </handlers>
              </config>

         ]]></attribute>
         </delegate-config>
         <binding port="4557"/>
      </service-config>

   </server>

Don’t forget to change

<attribute name="StoreURL">${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml</attribute>

to

<attribute name="StoreURL">${jboss.server.config}/jboss-bindings.xml</attribute>

You are now ready to start your second instance of JBoss AS.

Nicolas Leroux is a senior software developer at Lunatech Research. Although comments are disabled on this blog, he encourages you to send him comments by mail, corrections as well as opinions. Feedback is valued._