Version 3

    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.