14 Replies Latest reply on Apr 9, 2013 10:29 PM by Vikram Vis

    Automatic Client Connection Failover with NettyServlet (HTTPS servlet based connector)

    Todd Gould Novice

      I am using HornetQ v2.2.14.Final with JBoss 6.1.0.Final (I upgrade the default HornetQ install

      of that environment).

       

      I have defined a NettyServlet (HTTPS servlet based) connector to access HornetQ via HTTPS due

      to firewall restrictions.  I have tested and verified that this connector is functioning properly

      between a single server and client.

       

      My problem is related to clustering and automatic client failover.  We need the client connections

      that are connected via the HTTPS based NettyServlet connector to automatically failover when one of the

      servers in the cluster fails.  Unfortunately, this does not appear to be working as I understand it

      from reading the associated chapters 24. Client Reconnection and Session Reattachment,

      38. Clusters and 39. High Availability and Failover of the HornetQ Users Manual. 

       

      Here is the hornetq-configuration-file for server 1:

       

       

      <!--
        ~ Copyright 2009 Red Hat, Inc.
        ~  Red Hat licenses this file to you under the Apache License, version
        ~  2.0 (the "License"); you may not use this file except in compliance
        ~  with the License.  You may obtain a copy of the License at
        ~     http://www.apache.org/licenses/LICENSE-2.0
        ~  Unless required by applicable law or agreed to in writing, software
        ~  distributed under the License is distributed on an "AS IS" BASIS,
        ~  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
        ~  implied.  See the License for the specific language governing
        ~  permissions and limitations under the License.
        -->
      
      <configuration xmlns="urn:hornetq"
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xsi:schemaLocation="urn:hornetq /schema/hornetq-configuration.xsd">
         <clustered>true</clustered>
         <cluster-user>user_O</cluster-user>
         <cluster-password>password_O</cluster-password>
      
      
         <failover-on-shutdown>true</failover-on-shutdown>
      
         <!--  Don't change this name.
               This is used by the dependency framework on the deployers,
               to make sure this deployment is done before any other deployment -->
         <name>HornetQ.main.config</name>
      
         <log-delegate-factory-class-name>org.hornetq.integration.logging.Log4jLogDelegateFactory</log-delegate-factory-class-name>
      
         <bindings-directory>${jboss.server.data.dir}/hornetq/bindings</bindings-directory>
      
         <journal-directory>${jboss.server.data.dir}/hornetq/journal</journal-directory>
      
         <!-- Default journal file size is set to 1Mb for faster first boot -->
         <journal-file-size>${hornetq.journal.file.size:1048576}</journal-file-size>
      
         <!-- Default journal min file is 2, increase for higher average msg rates -->
         <journal-min-files>${hornetq.journal.min.files:2}</journal-min-files> 
      
      
         <large-messages-directory>${jboss.server.data.dir}/hornetq/largemessages</large-messages-directory>
      
         <paging-directory>${jboss.server.data.dir}/hornetq/paging</paging-directory>
      
         <connectors>
            <connector name="netty">
               <factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
               <param key="host"  value="${jboss.bind.address:localhost}"/>
               <param key="port"  value="${hornetq.remoting.netty.port:5445}"/>
            </connector>
      
            <connector name="netty-throughput">
               <factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
               <param key="host"  value="${jboss.bind.address:localhost}"/>
               <param key="port"  value="${hornetq.remoting.netty.batch.port:5455}"/>
               <param key="batch-delay" value="50"/>
            </connector>
      
            <connector name="netty-servlet">
                <factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
                <param key="host" value="${jboss.bind.address:127.0.0.1}"/>
                <param key="port" value="443"/>
                <param key="use-servlet" value="true"/>
                <param key="servlet-path" value="/NettyServlet/HornetQServlet"/>
                <param key="ssl-enabled" value="true"/>
                <param key="key-store-path" value="s01.jks"/>
                <param key="key-store-password" value="passwd"/>
            </connector>
      
            <connector name="in-vm">
               <factory-class>org.hornetq.core.remoting.impl.invm.InVMConnectorFactory</factory-class>
               <param key="server-id" value="${hornetq.server-id:0}"/>
            </connector>
      
         </connectors>
      
         <acceptors>   
            <acceptor name="netty">
               <factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>
               <param key="host"  value="${jboss.bind.address:localhost}"/>
               <param key="port"  value="${hornetq.remoting.netty.port:5445}"/>
            </acceptor>
      
            <acceptor name="netty-throughput">
               <factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>
               <param key="host"  value="${jboss.bind.address:localhost}"/>
               <param key="port"  value="${hornetq.remoting.netty.batch.port:5455}"/>
               <param key="batch-delay" value="50"/>
               <param key="direct-deliver" value="false"/>
            </acceptor>
      
            <acceptor name="netty-invm">
               <factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>
               <param key="use-invm" value="true"/>
               <param key="host" value="org.hornetq"/>
            </acceptor>                    
      
            <acceptor name="in-vm">
              <factory-class>org.hornetq.core.remoting.impl.invm.InVMAcceptorFactory</factory-class>
              <param key="server-id" value="0"/>
            </acceptor>
      
         </acceptors>
      
         <!-- Clustering configuration -->
         <broadcast-groups>
            <broadcast-group name="O-broadcast-group">
               <local-bind-address>192.168.1.1</local-bind-address>
               <local-bind-port>5432</local-bind-port>
               <group-address>231.7.7.7</group-address>
               <group-port>9876</group-port>
               <broadcast-period>100</broadcast-period>
               <connector-ref>netty</connector-ref>
            </broadcast-group>
         </broadcast-groups>
      
         <discovery-groups>
            <discovery-group name="O-discovery-group">
               <local-bind-address>192.168.1.1</local-bind-address>
               <group-address>231.7.7.7</group-address>
               <group-port>9876</group-port>
               <refresh-timeout>10000</refresh-timeout>
            </discovery-group>
         </discovery-groups>
      
         <cluster-connections>
            <cluster-connection name="O-cluster">
               <address>jms</address>
               <connector-ref>netty</connector-ref>
               <retry-interval>500</retry-interval>
               <use-duplicate-detection>true</use-duplicate-detection>
               <forward-when-no-consumers>true</forward-when-no-consumers>
               <max-hops>1</max-hops>
               <discovery-group-ref discovery-group-name="O-discovery-group"/>
            </cluster-connection>
         </cluster-connections>
      
         <security-settings>
            <!--
            <security-setting match="#">
               <permission type="createNonDurableQueue" roles="guest"/>
               <permission type="deleteNonDurableQueue" roles="guest"/>
               <permission type="consume" roles="guest"/>
               <permission type="send" roles="guest"/>
            </security-setting>
            -->
      
            <security-setting match="#">
               <permission type="createNonDurableQueue" roles="p1"/>
               <permission type="deleteNonDurableQueue" roles="p1"/>
               <permission type="consume" roles="p1"/>
               <permission type="send" roles="p1"/>
               <permission type="manage" roles="p1"/>
            </security-setting>
         </security-settings>
      
         <address-settings>
            <!--default for catch all-->
            <address-setting match="#">
               <dead-letter-address>jms.queue.DLQ</dead-letter-address>
               <expiry-address>jms.queue.ExpiryQueue</expiry-address>
               <redelivery-delay>0</redelivery-delay>
               <max-size-bytes>10485760</max-size-bytes>       
               <message-counter-history-day-limit>10</message-counter-history-day-limit>
               <address-full-policy>BLOCK</address-full-policy>
            </address-setting>
         </address-settings>
      
      </configuration>
      

       

       

      Here is the hornetq-configuration-file for server 2:

       

       

      <!--
        ~ Copyright 2009 Red Hat, Inc.
        ~  Red Hat licenses this file to you under the Apache License, version
        ~  2.0 (the "License"); you may not use this file except in compliance
        ~  with the License.  You may obtain a copy of the License at
        ~     http://www.apache.org/licenses/LICENSE-2.0
        ~  Unless required by applicable law or agreed to in writing, software
        ~  distributed under the License is distributed on an "AS IS" BASIS,
        ~  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
        ~  implied.  See the License for the specific language governing
        ~  permissions and limitations under the License.
        -->
      
      <configuration xmlns="urn:hornetq"
                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xsi:schemaLocation="urn:hornetq /schema/hornetq-configuration.xsd">
         <clustered>true</clustered>
         <cluster-user>user_O</cluster-user>
         <cluster-password>password_O</cluster-password>
      
         <!--
         -->
         <backup>true</backup>
         <failover-on-shutdown>true</failover-on-shutdown>
      
         <!--  Don't change this name.
               This is used by the dependency framework on the deployers,
               to make sure this deployment is done before any other deployment -->
         <name>HornetQ.main.config</name>
      
         <log-delegate-factory-class-name>org.hornetq.integration.logging.Log4jLogDelegateFactory</log-delegate-factory-class-name>
      
         <bindings-directory>${jboss.server.data.dir}/hornetq/bindings</bindings-directory>
      
         <journal-directory>${jboss.server.data.dir}/hornetq/journal</journal-directory>
      
         <!-- Default journal file size is set to 1Mb for faster first boot -->
         <journal-file-size>${hornetq.journal.file.size:1048576}</journal-file-size>
      
         <!-- Default journal min file is 2, increase for higher average msg rates -->
         <journal-min-files>${hornetq.journal.min.files:2}</journal-min-files> 
      
      
         <large-messages-directory>${jboss.server.data.dir}/hornetq/largemessages</large-messages-directory>
      
         <paging-directory>${jboss.server.data.dir}/hornetq/paging</paging-directory>
      
         <connectors>
            <connector name="netty">
               <factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
               <param key="host"  value="${jboss.bind.address:localhost}"/>
               <param key="port"  value="${hornetq.remoting.netty.port:5445}"/>
            </connector>
      
            <connector name="netty-throughput">
               <factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
               <param key="host"  value="${jboss.bind.address:localhost}"/>
               <param key="port"  value="${hornetq.remoting.netty.batch.port:5455}"/>
               <param key="batch-delay" value="50"/>
            </connector>
      
            <connector name="netty-servlet">
                <factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
                <param key="host" value="${jboss.bind.address:127.0.0.1}"/>
                <param key="port" value="443"/>
                <param key="use-servlet" value="true"/>
                <param key="servlet-path" value="/NettyServlet/HornetQServlet"/>
                <param key="ssl-enabled" value="true"/>
                <param key="key-store-path" value="s02.jks"/>
                <param key="key-store-password" value="passwd"/>
            </connector>
      
            <connector name="in-vm">
               <factory-class>org.hornetq.core.remoting.impl.invm.InVMConnectorFactory</factory-class>
               <param key="server-id" value="${hornetq.server-id:0}"/>
            </connector>
      
         </connectors>
      
         <acceptors>   
            <acceptor name="netty">
               <factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>
               <param key="host"  value="${jboss.bind.address:localhost}"/>
               <param key="port"  value="${hornetq.remoting.netty.port:5445}"/>
            </acceptor>
      
            <acceptor name="netty-throughput">
               <factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>
               <param key="host"  value="${jboss.bind.address:localhost}"/>
               <param key="port"  value="${hornetq.remoting.netty.batch.port:5455}"/>
               <param key="batch-delay" value="50"/>
               <param key="direct-deliver" value="false"/>
            </acceptor>
      
            <acceptor name="netty-invm">
               <factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>
               <param key="use-invm" value="true"/>
               <param key="host" value="org.hornetq"/>
            </acceptor>                    
      
            <acceptor name="in-vm">
              <factory-class>org.hornetq.core.remoting.impl.invm.InVMAcceptorFactory</factory-class>
              <param key="server-id" value="0"/>
            </acceptor>
      
         </acceptors>
      
         <!-- Clustering configuration -->
         <broadcast-groups>
            <broadcast-group name="O-broadcast-group">
               <local-bind-address>192.168.1.2</local-bind-address>
               <local-bind-port>5432</local-bind-port>
               <group-address>231.7.7.7</group-address>
               <group-port>9876</group-port>
               <broadcast-period>100</broadcast-period>
               <connector-ref>netty</connector-ref>
            </broadcast-group>
         </broadcast-groups>
      
         <discovery-groups>
            <discovery-group name="O-discovery-group">
               <local-bind-address>192.168.1.2</local-bind-address>
               <group-address>231.7.7.7</group-address>
               <group-port>9876</group-port>
               <refresh-timeout>10000</refresh-timeout>
            </discovery-group>
         </discovery-groups>
      
         <cluster-connections>
            <cluster-connection name="O-cluster">
               <address>jms</address>
               <connector-ref>netty</connector-ref>
               <retry-interval>500</retry-interval>
               <use-duplicate-detection>true</use-duplicate-detection>
               <forward-when-no-consumers>true</forward-when-no-consumers>
               <max-hops>1</max-hops>
               <discovery-group-ref discovery-group-name="O-discovery-group"/>
            </cluster-connection>
         </cluster-connections>
      
         <security-settings>
            <!--
            <security-setting match="#">
               <permission type="createNonDurableQueue" roles="guest"/>
               <permission type="deleteNonDurableQueue" roles="guest"/>
               <permission type="consume" roles="guest"/>
               <permission type="send" roles="guest"/>
            </security-setting>
            -->
      
            <security-setting match="#">
               <permission type="createNonDurableQueue" roles="p1"/>
               <permission type="deleteNonDurableQueue" roles="p1"/>
               <permission type="consume" roles="p1"/>
               <permission type="send" roles="p1"/>
               <permission type="manage" roles="p1"/>
            </security-setting>
         </security-settings>
      
         <address-settings>
            <!--default for catch all-->
            <address-setting match="#">
               <dead-letter-address>jms.queue.DLQ</dead-letter-address>
               <expiry-address>jms.queue.ExpiryQueue</expiry-address>
               <redelivery-delay>0</redelivery-delay>
               <max-size-bytes>10485760</max-size-bytes>       
               <message-counter-history-day-limit>10</message-counter-history-day-limit>
               <address-full-policy>BLOCK</address-full-policy>
            </address-setting>
         </address-settings>
      
      </configuration>
      

       

      Here is how I establish the connection in the client code.  Note that I am using core as JNDI is not

      available across the firewall:

       

       

      HashMap<String, Object> connectionParams1 = new HashMap<String, Object>();
      connectionParams1.put( TransportConstants.HOST_PROP_NAME, HOST_NAME );
      connectionParams1.put( TransportConstants.PORT_PROP_NAME, 443 );
      connectionParams1.put( TransportConstants.USE_SERVLET_PROP_NAME, true );
      connectionParams1.put( TransportConstants.SERVLET_PATH, "/NettyServlet/HornetQServlet" );
      connectionParams1.put( TransportConstants.SSL_ENABLED_PROP_NAME, true );            
      connectionParams1.put( TransportConstants.KEYSTORE_PATH_PROP_NAME, "s01.jks" );
      connectionParams1.put( TransportConstants.KEYSTORE_PASSWORD_PROP_NAME, "passwd" );
      
      TransportConfiguration transportConfiguration1 = new TransportConfiguration( org.hornetq.core.remoting.impl.netty.NettyConnectorFactory.class.getName(), connectionParams1 );
      
      HashMap<String, Object> connectionParams2 = new HashMap<String, Object>();
      connectionParams2.put( TransportConstants.HOST_PROP_NAME, HOST_NAME_2 );
      connectionParams2.put( TransportConstants.PORT_PROP_NAME, 443 );
      connectionParams2.put( TransportConstants.USE_SERVLET_PROP_NAME, true );
      connectionParams2.put( TransportConstants.SERVLET_PATH, "/NettyServlet/HornetQServlet" );
      connectionParams2.put( TransportConstants.SSL_ENABLED_PROP_NAME, true );            
      connectionParams2.put( TransportConstants.KEYSTORE_PATH_PROP_NAME, "s02.jks" );
      connectionParams2.put( TransportConstants.KEYSTORE_PASSWORD_PROP_NAME, "passwd" );
      
      TransportConfiguration transportConfiguration2 = new TransportConfiguration( org.hornetq.core.remoting.impl.netty.NettyConnectorFactory.class.getName(), connectionParams2 );
      
      HornetQConnectionFactory connectionFactory = HornetQJMSClient.createConnectionFactoryWithHA( JMSFactoryType.CF, transportConfiguration1, transportConfiguration2 );
      connectionFactory.setClientFailureCheckPeriod( 2500 );
      connectionFactory.setRetryInterval( 3000 );
      connectionFactory.setReconnectAttempts( 5 );
      connectionFactory.setFailoverOnInitialConnection( true );
      System.out.println( "isHA: " + connectionFactory.isHA() );     // this returns true in the client output
      Connection connection = connectionFactory.createConnection("user", "pswd" );
      
      connection.setExceptionListener( this );
      
      ......
      
      Session session = connection.createSession( false, Session.AUTO_ACKNOWLEDGE );
      ......
      
      Topic topic = HornetQJMSClient.createTopic( TOPIC_NAME );
      
      MessageConsumer subscriber = session.createConsumer( topic );            
      subscriber.setMessageListener( this );
      
      connection.start();
      
      
      
      
      

       

      Both servers start successfully.  I proceed to start publication on the servers and then bring up my

      test client (a subscriber).  The client successfully sees and receives the publication traffic.  I

      then proceed to kill one of the servers in order to test the automatic client connection failover.

      However, this connection does not succeed to failover and the client never receives any further

      publications (despite the fact that the server has successfully failed over to the other server

      - the two servers are also JBoss clustered and the surviving server is the new master).

       

      Here is the error message I receive after the configrued retry attempts on the client side:

       

      Apr 5, 2013 11:53:50 AM org.hornetq.core.logging.impl.JULLogDelegate warn

      WARNING: Tried 5 times to connect. Now giving up on reconnecting it.

      Exception caught: javax.jms.JMSException: HornetQException[errorCode=0 message=Netty exception]

      Apr 5, 2013 11:53:50 AM org.hornetq.core.logging.impl.JULLogDelegate warn

      WARNING: Failed to connect to server.

      javax.jms.JMSException: HornetQException[errorCode=0 message=Netty exception]

          at org.hornetq.jms.client.HornetQConnection$JMSFailureListener.connectionFailed(HornetQConnection.java:643)

          at org.hornetq.core.client.impl.ClientSessionFactoryImpl.callFailureListeners(ClientSessionFactoryImpl.java:906)

          at org.hornetq.core.client.impl.ClientSessionFactoryImpl.failoverOrReconnect(ClientSessionFactoryImpl.java:691)

          at org.hornetq.core.client.impl.ClientSessionFactoryImpl.handleConnectionFailure(ClientSessionFactoryImpl.java:557)

          at org.hornetq.core.client.impl.ClientSessionFactoryImpl.connectionException(ClientSessionFactoryImpl.java:395)

          at org.hornetq.core.remoting.impl.netty.NettyConnector$Listener$2.run(NettyConnector.java:728)

          at org.hornetq.utils.OrderedExecutorFactory$OrderedExecutor$1.run(OrderedExecutorFactory.java:100)

          at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

          at java.lang.Thread.run(Thread.java:662)

      Caused by: HornetQException[errorCode=0 message=Netty exception]

          at org.hornetq.core.remoting.impl.netty.HornetQChannelHandler.exceptionCaught(HornetQChannelHandler.java:108)

          at org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:142)

          at org.jboss.netty.channel.StaticChannelPipeline.sendUpstream(StaticChannelPipeline.java:372)

          at org.jboss.netty.channel.StaticChannelPipeline$StaticChannelHandlerContext.sendUpstream(StaticChannelPipeline.java:534)

          at org.jboss.netty.channel.SimpleChannelUpstreamHandler.exceptionCaught(SimpleChannelUpstreamHandler.java:148)

          at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:122)

          at org.jboss.netty.channel.StaticChannelPipeline.sendUpstream(StaticChannelPipeline.java:372)

          at org.jboss.netty.channel.StaticChannelPipeline.sendUpstream(StaticChannelPipeline.java:367)

          at org.jboss.netty.channel.Channels.fireExceptionCaught(Channels.java:432)

          at org.jboss.netty.channel.socket.http.HttpTunnelingClientSocketChannel$ServletChannelHandler.exceptionCaught(HttpTunnelingClientSocketChannel.java:398)

          at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:122)

          at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)

          at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:783)

          at org.jboss.netty.handler.codec.replay.ReplayingDecoder.exceptionCaught(ReplayingDecoder.java:461)

          at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:122)

          at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)

          at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:783)

          at org.jboss.netty.handler.ssl.SslHandler.exceptionCaught(SslHandler.java:510)

          at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:122)

          at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)

          at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)

          at org.jboss.netty.channel.Channels.fireExceptionCaught(Channels.java:432)

          at org.jboss.netty.channel.socket.oio.OioWorker.run(OioWorker.java:85)

          at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)

          at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:44)

          at org.jboss.netty.util.VirtualExecutorService$ChildExecutorRunnable.run(VirtualExecutorService.java:181)

          ... 3 more

      Caused by: java.net.SocketException: Connection reset

          at java.net.SocketInputStream.read(SocketInputStream.java:168)

          at java.net.SocketInputStream.read(SocketInputStream.java:182)

          at java.io.FilterInputStream.read(FilterInputStream.java:66)

          at java.io.PushbackInputStream.read(PushbackInputStream.java:122)

          at org.jboss.netty.channel.socket.oio.OioWorker.run(OioWorker.java:76)

          ... 4 more

       

      Lastly, here is the error message I receive on the survining server (roughly coincident with failing the first server):

       

       

      11:53:28,000 INFO  [STDOUT] Removing clusterName=5e43d7f8-ca51-4e13-b1c5-6f159df975c81d3d60fc-9dfb-11e2-b73f-a75fdceaebbb

      on ClusterConnectionImpl@25086162[nodeUUID=59e24865-9dfb-11e2-8503-d1877f948bed, connector=org-hornetq-core-remoting-i

      mpl-netty-NettyConnectorFactory?port=5445&host=s02, address=jms, server=HornetQServerImpl::server

      UUID=59e24865-9dfb-11e2-8503-d1877f948bed]

      11:53:33,162 WARN  [org.hornetq.core.server.cluster.impl.BridgeImpl] ClusterConnectionBridge@729ba9 [name=sf.O

      -cluster.1d3d60fc-9dfb-11e2-b73f-a75fdceaebbb, queue=QueueImpl[name=sf.O_-cluster.1d3d60fc-9dfb-11e2-b73f-a75fd

      ceaebbb, postOffice=PostOfficeImpl [server=HornetQServerImpl::serverUUID=59e24865-9dfb-11e2-8503-d1877f948bed]]@49a3a9 t

      argetConnector=ServerLocatorImpl (identity=(Cluster-connection-bridge::ClusterConnectionBridge@729ba9 [name=sf.O

      -cluster.1d3d60fc-9dfb-11e2-b73f-a75fdceaebbb, queue=QueueImpl[name=sf.O-cluster.1d3d60fc-9dfb-11e2-b73f-a75

      fdceaebbb, postOffice=PostOfficeImpl [server=HornetQServerImpl::serverUUID=59e24865-9dfb-11e2-8503-d1877f948bed]]@49a3a9

      targetConnector=ServerLocatorImpl [initialConnectors=[org-hornetq-core-remoting-impl-netty-NettyConnectorFactory?port=5

      445&host=s01], discoveryGroupConfiguration=null]]::ClusterConnectionImpl@25086162[nodeUUID=59e248

      65-9dfb-11e2-8503-d1877f948bed, connector=org-hornetq-core-remoting-impl-netty-NettyConnectorFactory?port=5445&host=

      s02, address=jms, server=HornetQServerImpl::serverUUID=59e24865-9dfb-11e2-8503-d1877f948bed])) [initi

      alConnectors=[org-hornetq-core-remoting-impl-netty-NettyConnectorFactory?port=5445&host=s01], dis

      coveryGroupConfiguration=null]]::Connection failed with failedOver=false-HornetQException[errorCode=0 message=Netty exce

      ption]: HornetQException[errorCode=0 message=Netty exception]

              at org.hornetq.core.remoting.impl.netty.HornetQChannelHandler.exceptionCaught(HornetQChannelHandler.java:108) [:

      ]

              at org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:142) [:]

              at org.jboss.netty.channel.StaticChannelPipeline.sendUpstream(StaticChannelPipeline.java:372) [:]

              at org.jboss.netty.channel.StaticChannelPipeline$StaticChannelHandlerContext.sendUpstream(StaticChannelPipeline.

      java:534) [:]

              at org.jboss.netty.channel.SimpleChannelUpstreamHandler.exceptionCaught(SimpleChannelUpstreamHandler.java:148) [

      :]

              at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:122) [:

      ]

              at org.jboss.netty.channel.StaticChannelPipeline.sendUpstream(StaticChannelPipeline.java:372) [:]

              at org.jboss.netty.channel.StaticChannelPipeline.sendUpstream(StaticChannelPipeline.java:367) [:]

              at org.jboss.netty.channel.Channels.fireExceptionCaught(Channels.java:432) [:]

              at org.jboss.netty.channel.socket.oio.OioWorker.run(OioWorker.java:85) [:]

              at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) [:]

              at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:44) [:]

              at org.jboss.netty.util.VirtualExecutorService$ChildExecutorRunnable.run(VirtualExecutorService.java:181) [:]

              at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) [:1.6.0_23]

              at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [:1.6.0_23]

              at java.lang.Thread.run(Unknown Source) [:1.6.0_23]

      Caused by: java.net.SocketException: Connection reset

              at java.net.SocketInputStream.read(Unknown Source) [:1.6.0_23]

              at java.net.SocketInputStream.read(Unknown Source) [:1.6.0_23]

              at java.io.FilterInputStream.read(Unknown Source) [:1.6.0_23]

              at java.io.PushbackInputStream.read(Unknown Source) [:1.6.0_23]

              at org.jboss.netty.channel.socket.oio.OioWorker.run(OioWorker.java:76) [:]

              ... 4 more

       

      I'd greatly appreciate your assistance with this.  I'm sure I must be missing a critical step,

      but cannot seem to locate it from the documentation and/or examples.

       

      Thanks!