On Tue, 2010-05-11 at 00:43 +0100, Tammer Salem wrote: > 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. >
You could try doing an explicit close on all the NMS.Stomp resources that you created, session, connection etc before recreating to see if that frees up a resource that is preventing you from reconnecting to that same URI. Regards Tim. > 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/ > > > > -- 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/