activemq-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Timothy Bish <tabish...@gmail.com>
Subject Re: NMS - cannot recover from connection failure
Date Mon, 10 May 2010 20:31:07 GMT
On Mon, 2010-05-10 at 15:04 +0100, Tammer Salem wrote:
> Hello All,
> I have an NMS client using the stomp broker on a .netcf device. For the most
> part it works absolutely fine, but now I'm trying to harden the device (for
> network failures etc.).
> I have added an exception listener and specifically look for IOExceptions
> (which I believe are what .NET throws if the GPRS/3G network connectivity
> dies). I can successfully capture this exception and then I fire off a
> thread to restart the connection and add my listeners again.
> 
> At the moment this method doesn't seem to work - I can never get a
> connection again. Can anyone advise what is the best way of doing this?
> 

So what happens exactly when the code attempts to create the new
Connection object and restore the Sessions and Destinations etc?  Is
there an exception being thrown?

Regards
Tim.


> I've also attached my code so that you know what I'm trying to do.
> 
>     class AMQMessageHandler
> 
>     {
> 
>         private String myQueue;
> 
>         private String connecturi;
> 
> 
> 
>         //private ISession session;
> 
>         IConnectionFactory factory;
> 
>         IConnection connection;
> 
>         ISession session;
> 
>         IDestination destination;
> 
>         IMessageConsumer messageConsumer;
> 
> 
> 
>         /*
> 
>          * the UI thread within whose context the code will be executed
> 
>          */
> 
>         private Form uiThread;
> 
> 
> >         /*
> 
>          * function in the UI thread to handle exceptions
> 
>          */
> 
>         private Delegate exceptionDelegate;
> 
> 
> >
> >         public AMQMessageHandler(String connectionURI, String driverID,
> > Delegate exceptionDelegate, Form uiThread)
> 
>         {
> 
>             this.connecturi = connectionURI;
> 
>             this.myQueue = "driver.channel." + driverID;
> 
>             this.uiThread = uiThread;
> 
>             this.exceptionDelegate    = exceptionDelegate;
> 
>         }
> 
> 
> >         public void start()
> 
>         {
> 
> 
> >             try
> 
>             {
> 
>                 this.factory = new ConnectionFactory(connecturi);
> 
>                 this.connection = this.factory.CreateConnection();
> 
>                 this.session = this.connection.CreateSession();
> 
>                 this.destination = SessionUtil.GetDestination(session,
> > "queue://" + myQueue);
> 
>                 this.messageConsumer = session.CreateConsumer(destination);
> 
> 
> 
>                 messageConsumer.Listener += new
> > MessageListener(messageConsumer_Listener);
> 
>                 connection.ExceptionListener += new
> > ExceptionListener(connection_ExceptionListener);
> 
>                 connection.Start();
> 
> 
> >             }
> 
>             catch (Exception ex)
> 
>             {
> 
>                 uiThread.Invoke(exceptionDelegate,ex.Message);
> 
>             }
> 
>         }
> 
> 
> >         public delegate void RestartConnectionDelegate();
> 
> 
> >         private void restartConnection()
> 
>         {
> 
>             new System.Threading.Thread(threadedStartConnection).Start();
> 
>         }
> 
> 
> >         private void threadedStartConnection()
> 
>         {
> 
>             int retryCount = 1;
> 
>             bool keepTryingtoRestart = true;
> 
> 
> >             while (keepTryingtoRestart == true)
> 
>             {
> 
>                 //tsalem - add some kind of logging here
> 
>                 //listBox.Items.Add("attempting to reconnect - pass " +
> > retryCount);
> 
>                 System.Threading.Thread.Sleep(3000);
> 
> 
> >                 try
> 
>                 {
> 
>                     this.factory = new ConnectionFactory(connecturi);
> 
>                     this.connection = this.factory.CreateConnection();
> 
>                     this.session = this.connection.CreateSession();
> 
>                     this.destination = SessionUtil.GetDestination(session,
> > "queue://" + myQueue);
> 
>                     this.messageConsumer =
> > session.CreateConsumer(destination);
> 
>                     messageConsumer.Listener += new
> > MessageListener(messageConsumer_Listener);
> 
>                     connection.ExceptionListener += new
> > ExceptionListener(connection_ExceptionListener);
> 
>                     connection.Start();
> 
> 
> >                     keepTryingtoRestart = false;
> 
>                 }
> 
>                 catch (Exception ex)
> 
>                 {
> 
>                     uiThread.Invoke(exceptionDelegate, ex.Message +"\n" +
> > ex.StackTrace);
> 
>                     //tsalem change this to check for keep retrying rather
> > than on a counter
> 
>                     if (retryCount == 50)
> 
>                     {
> 
>                         keepTryingtoRestart = false;
> 
>                     }
> 
> 
> >                 }
> 
> 
> 
>                 retryCount++;
> 
>             }
> 
>         }
> 
> 
> >
> >         public void messageConsumer_Listener(IMessage receivedMessage)
> 
>         {
> 
>             try
> 
>             {
> 
>                 ITextMessage message = receivedMessage as ITextMessage;
> 
>                 message.Acknowledge();
> 
>                 //tsalem - todo - handle message
> 
>                 if (message.Text != null)
> 
>                 {
> 
>                     AMQUtil.Instance.ResponseAvailable(message.Text,
> > uiThread);
> 
>                 }
> 
>                 else
> 
>                 {
> 
>                     uiThread.Invoke(exceptionDelegate, "ERROR: AMQ Message
> > is empty");
> 
>                 }
> 
>             }
> 
>             catch (Exception ex)
> 
>             {
> 
>                 uiThread.Invoke(exceptionDelegate,ex.Message);
> 
>             }
> 
>         }
> 
> 
> >
> >
> >         void connection_ExceptionListener(Exception exception)
> 
>         {
> 
>             uiThread.Invoke(exceptionDelegate,exception.Message);
> 
> 
> >             if (exception is System.IO.IOException)
> 
>             {
> 
>                 //Invoke(new
> > RestartConnectionDelegate(threadedStartConnection));
> 
>                 threadedStartConnection();
> 
>             }
> 
>         }
> 
>     }
> 
> 
> regards,
> Tammer

-- 
Tim Bish

Open Source Integration: http://fusesource.com
ActiveMQ in Action: http://www.manning.com/snyder/

Follow me on Twitter: http://twitter.com/tabish121
My Blog: http://timbish.blogspot.com/


Mime
View raw message