/** * */ package org.limewire.xmpp.client.impl; import org.limewire.concurrent.ThreadExecutor; import org.limewire.listener.EventListener; import org.limewire.logging.Log; import org.limewire.logging.LogFactory; import org.limewire.util.DebugRunnable; import org.limewire.friend.api.FriendConnection; import org.limewire.friend.api.FriendConnectionConfiguration; import org.limewire.friend.api.FriendConnectionEvent; import org.limewire.friend.api.FriendException; import org.limewire.friend.api.Network; /** * Different implementation from {@link org.jivesoftware.smack.ReconnectionManager} * to ensure thread safe behavior. */ class ReconnectionManager implements EventListener<FriendConnectionEvent> { private static final int MAX_RECONNECTION_ATTEMPTS = 10; private static final Log LOG = LogFactory.getLog(ReconnectionManager.class); private final XMPPConnectionFactoryImpl serviceImpl; /** * @param serviceImpl */ ReconnectionManager(XMPPConnectionFactoryImpl serviceImpl) { this.serviceImpl = serviceImpl; } private volatile boolean connected; @Override public void handleEvent(FriendConnectionEvent event) { // todo: should not be necessary to check for xmpp. Address this in LWC-3436, ReconnectionManager for facebook if (event.getSource().getConfiguration().getType() == Network.Type.XMPP) { if(event.getType() == FriendConnectionEvent.Type.CONNECTED) { connected = true; } else if(event.getType() == FriendConnectionEvent.Type.DISCONNECTED) { if(event.getException() != null && connected) { FriendConnection connection = event.getSource(); final FriendConnectionConfiguration configuration = connection.getConfiguration(); Thread t = ThreadExecutor.newManagedThread(new DebugRunnable(new Runnable() { @Override public void run() { long sleepTime = 10000; FriendConnection newConnection = null; for(int i = 0; i < MAX_RECONNECTION_ATTEMPTS && newConnection == null; i++) { try { LOG.debugf("attempting to reconnect to {0} ..." + configuration.getServiceName()); newConnection = serviceImpl.loginImpl(configuration, true); } catch (FriendException e) { // Ignored } try { Thread.sleep(sleepTime); } catch (InterruptedException e) { // Ignored } } LOG.debugf("giving up trying to connect to {0}" + configuration.getServiceName()); } }), "xmpp-reconnection-manager"); t.start(); } connected = false; } } } }