1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2012-2013 Florian Schmaus 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License. 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * http://www.apache.org/licenses/LICENSE-2.0 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS, 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License. 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smackx.ping; 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.lang.ref.WeakReference; 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Set; 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.Connection; 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenclass ServerPingTask implements Runnable { 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // This has to be a weak reference because IIRC all threads are roots 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // for objects and we have a new thread here that should hold a strong 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // reference to connection so that it can be GCed. 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private WeakReference<Connection> weakConnection; 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private int delta = 1000; // 1 seconds 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private int tries = 3; // 3 tries 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen protected ServerPingTask(Connection connection) { 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.weakConnection = new WeakReference<Connection>(connection); 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void run() { 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Connection connection = weakConnection.get(); 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (connection == null) { 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // connection has been collected by GC 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // which means we can stop the thread by breaking the loop 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return; 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (connection.isAuthenticated()) { 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen PingManager pingManager = PingManager.getInstanceFor(connection); 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen boolean res = false; 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (int i = 0; i < tries; i++) { 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (i != 0) { 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Thread.sleep(delta); 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } catch (InterruptedException e) { 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // We received an interrupt 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // This only happens if we should stop pinging 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return; 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen res = pingManager.pingMyServer(); 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // stop when we receive a pong back 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (res) { 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen pingManager.lastSuccessfulPingByTask = System.currentTimeMillis(); 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (!res) { 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Set<PingFailedListener> pingFailedListeners = pingManager.getPingFailedListeners(); 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (PingFailedListener l : pingFailedListeners) { 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen l.pingFailed(); 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else { 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Ping was successful, wind-up the periodic task again 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen pingManager.maybeSchedulePingServerTask(); 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 78