Multiple instances of JBoss AS7 on the same machine

Overview:

 

This wiki explains how multiple instances of JBoss AS7 standalone server, on single physical system, can be started simultaneously.

 

Approach#1

 

[Tested against JBoss AS7.0.0 Beta2 and AS7 upstream dated April 8 2011]

 

In this approach we will create multiple copies of JBoss AS7 on a single system.

 

  • Download JBoss AS7. And unzip it to some location. Let's call this instance <jboss-as-7-one>
  • As a sanity test, just start this server once, by running the following script from the <jboss-as-7-one>/bin folder:

 

jpai@jpai-laptop:bin$ ./standalone.sh
  • Make sure the server starts without any errors. Once it has started, shutdown the server by using Ctrl + C
  • Let's now copy the entire <jboss-as-7-one> instance to <jboss-as-7-two>. We now have 2 copies of JBoss AS7 on our system.
  • Our next step is to configure the second instance to use a different IP address to bind the services to. By default, <jboss-as-7-one> instance uses 127.0.0.1 as the IP address to bind the  services to. This in configured in JBOSS_HOME/standalone/configuration/standalone.xml file (only relevant sections pasted below):

 

...
    <management-interfaces>
        <native-interface interface="default" port="9999"/>
        <http-interface interface="default" port="9990"/>
    </management-interfaces>
...

<interfaces>
        <interface name="default">
            <inet-address value="127.0.0.1"/>
        </interface>
        <interface name="any">
            <any-address/>
        </interface>
        <interface name="complex">
            <any>
                <subnet-match value="192.168.0.0/16"/>
                <public-address/>
            </any>
            <not>
                <site-local-address/>
            </not>
            <up/>
            <multicast/>
        </interface>
    </interfaces>
    <socket-binding-group name="standard-sockets" default-interface="default">
        <socket-binding name="jndi" port="1099"/>
        <socket-binding name="jmx-connector-registry" port="1090"/>
        <socket-binding name="jmx-connector-server" port="1091"/>
        <socket-binding name="http" port="8080"/>
        <socket-binding name="https" port="8447"/>
        <socket-binding name="osgi-http" port="8090"/>
        <socket-binding name="remoting" port="4447"/>
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
        <socket-binding name="txn-socket-process-id" port="4714"/>
        <socket-binding name="messaging" port="5445"/>
        <socket-binding name="messaging-throughput" port="5455"/>
    </socket-binding-group>

 

As can be seen, the management interface and the socket bindings, all use the interface named "default", which binds to 127.0.0.1.

 

  • Now for <jboss-as-7-two> let's configure this file to use a different interface.
  • Open the <jboss-as-7-two>/standalone/configuration/standalone.xml in a text editor and a custom interface to the <interfaces> section. In this example, we'll name the new interface "specific-ip-interface" and let it bind to a specific IP XXX.YYY.AAA.BBB (should be a valid IP address). So here's the new interface definition:
<interfaces>
        <interface name="default">
            <inet-address value="127.0.0.1"/>
        </interface>
        <!-- New interface for our second instance -->
        <interface name="specific-ip-interface">
            <inet-address value="XXX.YYY.AAA.BBB"/>
        </interface>
        <interface name="any">
            <any-address/>
        </interface>
        <interface name="complex">
            <any>
                <subnet-match value="192.168.0.0/16"/>
                <public-address/>
            </any>
            <not>
                <site-local-address/>
            </not>
            <up/>
            <multicast/>
        </interface>
    </interfaces>

 

  • Our next step is to let the socket bindings and the management interface, use this new interface instead of the default one.
  • So continue editing the  <jboss-as-7-two>/standalone/configuration/standalone.xml and point the management interface and socket bindings to use this new interface as follows:
...

    <management-interfaces>
        <native-interface interface="specific-ip-interface" port="9999"/>
        <http-interface interface="specific-ip-interface" port="9990"/>
    </management-interfaces>
...

    <interfaces>
        <interface name="default">
            <inet-address value="127.0.0.1"/>
        </interface>
        <!-- New interface for our second instance -->
        <interface name="specific-ip-interface">
            <inet-address value="XXX.YYY.AAA.BBB"/>
        </interface>
        <interface name="any">
            <any-address/>
        </interface>
        <interface name="complex">
            <any>
                <subnet-match value="192.168.0.0/16"/>
                <public-address/>
            </any>
            <not>
                <site-local-address/>
            </not>
            <up/>
            <multicast/>
        </interface>
    </interfaces>
    <socket-binding-group name="standard-sockets" default-interface="specific-ip-interface">
        <socket-binding name="jndi" port="1099"/>
        <socket-binding name="jmx-connector-registry" port="1090"/>
        <socket-binding name="jmx-connector-server" port="1091"/>
        <socket-binding name="http" port="8080"/>
        <socket-binding name="https" port="8447"/>
        <socket-binding name="osgi-http" port="8090"/>
        <socket-binding name="remoting" port="4447"/>
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
        <socket-binding name="txn-socket-process-id" port="4714"/>
        <socket-binding name="messaging" port="5445"/>
        <socket-binding name="messaging-throughput" port="5455"/>
    </socket-binding-group>

 

  • Save the changes. That's it for configurations. Now let's start these individual instances.
  • From the command prompt, go to <jboss-as-7-one>/bin and run the following command:
jpai@jpai-laptop:jboss-as-7-one/bin$ ./standalone.sh

 

  • Run the same command from <jboss-as-7-two>/bin:
jpai@jpai-laptop:jboss-as-7-two/bin$ ./standalone.sh

 

You'll now have 2 different instances of JBoss AS7 running on the same physical system.

 

Approach#2

 

Use the same interface but bind to different ports:

 

...
    <management-interfaces>
        <native-interface interface="default" port="19999"/>
        <http-interface interface="default" port="19990"/>
    </management-interfaces>
...


    <socket-binding-group name="standard-sockets" default-interface="default" port-offset="100">
        <socket-binding name="jndi" port="1099"/>
        <socket-binding name="jmx-connector-registry" port="1090"/>
        <socket-binding name="jmx-connector-server" port="1091"/>
        <socket-binding name="http" port="8080"/>
        <socket-binding name="https" port="8447"/>
        <socket-binding name="osgi-http" port="8090"/>
        <socket-binding name="remoting" port="4447"/>
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
        <socket-binding name="txn-socket-process-id" port="4714"/>
        <socket-binding name="messaging" port="5445"/>
        <socket-binding name="messaging-throughput" port="5455"/>
    </socket-binding-group>

 

The key is the "port-offset" param on the socket-binding-group param. With that set, all sockets (except those whose socket-binding element has a 'fixed-port="true"' attribute) will have their port number offset by 100 from the declared value.

 

All sockets, that is, except the 2 management interfaces, which (currently at least) aren't getting their socket configuration from the socket-binding-group, hence the new port values in the example above.