Sorry - yes I get an exception stating that it cannot connect to the given URI (even though the URI is 100% correct in that block of code). When I shut down the client and restart it - it works fine.
On 10 May 2010 21:31, Timothy Bish <tabish...@gmail.com> wrote: > 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/ > >