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/