Archived
This forum has been archived. Please start a new discussion on GitHub.
Bi-directional conn. reestablishment
Hi,
I've got a client that makes a bi-directional connection with a server. I thought that I had found a way to detect when the server went down and have the client properly reestablish the connection. This seemed to fail the other day in production, though I have yet to get it to fail in test.
What I do on the client is have a thread that pings the server every so often. After the ping, I check to see if the adapter registered on the connection is NULL, if so, I reset the adapter and register the callback object with the server. Should this ALWAYS work? Any suggestions or thoughts appreciated.
I've got a client that makes a bi-directional connection with a server. I thought that I had found a way to detect when the server went down and have the client properly reestablish the connection. This seemed to fail the other day in production, though I have yet to get it to fail in test.
What I do on the client is have a thread that pings the server every so often. After the ping, I check to see if the adapter registered on the connection is NULL, if so, I reset the adapter and register the callback object with the server. Should this ALWAYS work? Any suggestions or thoughts appreciated.
ScheduleVersionIFPrx ver; Ice::Identity ident; IceUtil::Monitor<IceUtil::Mutex>::Lock lock(m_connMonitor); Ice::ObjectAdapterPtr adapter = m_server->adapter(); try { ident.name = IceUtil::generateUUID(); adapter->add(m_listener, ident); m_scheduleServer->ice_connection()->setAdapter(adapter); m_scheduleServer->regTxListenerIdent(ident, m_listener->lastReceived()); // // Do a ping every once in a while to test the state of the connection. If the // connection is the same as before, nothing happens. If the connection was // reestablished, set the adapter and register the listener. If the connection // can't be reestablished (server down), throw and exception and let everything // start over. // while (true) { m_scheduleServer->ice_ping(); if (m_scheduleServer->ice_connection()->getAdapter() == 0) { m_scheduleServer->ice_connection()->setAdapter(adapter); m_scheduleServer->regTxListenerIdent(ident, m_listener->lastReceived()); } } }
0
Comments
-
Hi,
You should add a call to sleep in your loop, otherwise you'll continuously ping the server. In any case, I can't think of any reasons why this wouldn't work. However without more information about the failure it's hard to say what could have gone wrong.
Cheers,
Benoit.0 -
Thanks
There was a sleep in there. I must have removed it in haste when I posted the code. As long as this *should* work, I won't fret.
Thanks again,0