package onlinefrontlines.lobby; import java.util.ArrayList; import java.sql.SQLException; import onlinefrontlines.profiler.Profiler; import onlinefrontlines.profiler.Sampler; import onlinefrontlines.utils.Tools; import onlinefrontlines.utils.CacheException; import org.apache.log4j.Logger; /** * This thread wakes up every X seconds to update the user stats * * @author jorrit * * Copyright (C) 2009-2013 Jorrit Rouwe * * This file is part of Online Frontlines. * * Online Frontlines is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Online Frontlines is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Online Frontlines. If not, see <http://www.gnu.org/licenses/>. */ public class LobbyUserUpdateThread extends Thread { private static final Logger log = Logger.getLogger(LobbyUserUpdateThread.class); /** * Constructor */ public LobbyUserUpdateThread() { super("LobbyUserUpdateThread"); } /** * Run the thread */ public void run() { log.info("Thread started"); for (;;) { try { // Loop through all lobbies and get all users ArrayList<LobbyUser> users = new ArrayList<LobbyUser>(); for (LobbyState lobbyState : LobbyStateCache.getInstance().getValuesQuiet()) synchronized (lobbyState) { users.addAll(lobbyState.getUsers()); } // Process them all one by one for (LobbyUser u : users) { Sampler sampler = Profiler.getInstance().startSampler(Profiler.CATEGORY_GENERAL, "LobbyUserUpdateThread.run update user"); try { // Process user u.updateUserInfo(); } catch (CacheException e) { Tools.logException(e); } catch (SQLException e) { Tools.logException(e); } finally { sampler.stop(); } // Wait synchronized (this) { wait(1000); } } } catch (InterruptedException e) { // Normal termination break; } catch (Exception e) { // Log error, retry Tools.logException(e); } try { // Wait for next cycle synchronized (this) { wait(5000); } } catch (InterruptedException e) { // Normal termination break; } } log.info("Thread stopped"); } }