Rework shutdown sequence to close #391

This commit is contained in:
md_5 2013-05-30 16:23:02 +10:00
parent 0cd4c9030c
commit 0578f94522
2 changed files with 66 additions and 67 deletions

View File

@ -85,6 +85,7 @@ public class BungeeCord extends ProxyServer
* locations.yml save thread. * locations.yml save thread.
*/ */
private final Timer saveThread = new Timer( "Reconnect Saver" ); private final Timer saveThread = new Timer( "Reconnect Saver" );
private final Timer metricsThread = new Timer( "Metrics Thread" );
/** /**
* Server socket listener. * Server socket listener.
*/ */
@ -213,8 +214,7 @@ public class BungeeCord extends ProxyServer
getReconnectHandler().save(); getReconnectHandler().save();
} }
}, 0, TimeUnit.MINUTES.toMillis( 5 ) ); }, 0, TimeUnit.MINUTES.toMillis( 5 ) );
metricsThread.scheduleAtFixedRate( new Metrics(), 0, TimeUnit.MINUTES.toMillis( Metrics.PING_INTERVAL ) );
new Metrics().start();
} }
public void startListeners() public void startListeners()
@ -265,44 +265,58 @@ public class BungeeCord extends ProxyServer
@Override @Override
public void stop() public void stop()
{ {
this.isRunning = false; new Thread( "Shutdown Thread" )
httpClient.close();
executors.shutdown();
stopListeners();
getLogger().info( "Closing pending connections" );
connectionLock.readLock().lock();
try
{ {
getLogger().info( "Disconnecting " + connections.size() + " connections" ); @Override
for ( UserConnection user : connections.values() ) public void run()
{ {
user.disconnect( getTranslation( "restart" ) ); BungeeCord.this.isRunning = false;
httpClient.close();
executors.shutdown();
stopListeners();
getLogger().info( "Closing pending connections" );
connectionLock.readLock().lock();
try
{
getLogger().info( "Disconnecting " + connections.size() + " connections" );
for ( UserConnection user : connections.values() )
{
user.disconnect( getTranslation( "restart" ) );
}
} finally
{
connectionLock.readLock().unlock();
}
getLogger().info( "Closing IO threads" );
eventLoops.shutdownGracefully();
try
{
eventLoops.awaitTermination( Long.MAX_VALUE, TimeUnit.NANOSECONDS );
} catch ( InterruptedException ex )
{
}
getLogger().info( "Saving reconnect locations" );
reconnectHandler.save();
saveThread.cancel();
metricsThread.cancel();
// TODO: Fix this shit
getLogger().info( "Disabling plugins" );
for ( Plugin plugin : pluginManager.getPlugins() )
{
plugin.onDisable();
getScheduler().cancel( plugin );
}
getLogger().info( "Thankyou and goodbye" );
System.exit( 0 );
} }
} finally }.start();
{
connectionLock.readLock().unlock();
}
getLogger().info( "Closing IO threads" );
eventLoops.shutdownGracefully();
getLogger().info( "Saving reconnect locations" );
reconnectHandler.save();
saveThread.cancel();
// TODO: Fix this shit
getLogger().info( "Disabling plugins" );
for ( Plugin plugin : pluginManager.getPlugins() )
{
plugin.onDisable();
getScheduler().cancel( plugin );
}
getLogger().info( "Thankyou and goodbye" );
System.exit( 0 );
} }
/** /**

View File

@ -8,9 +8,10 @@ import java.io.UnsupportedEncodingException;
import java.net.URL; import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.TimerTask;
import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.ProxyServer;
public class Metrics extends Thread public class Metrics extends TimerTask
{ {
/** /**
@ -28,41 +29,25 @@ public class Metrics extends Thread
/** /**
* Interval of time to ping (in minutes) * Interval of time to ping (in minutes)
*/ */
private final static int PING_INTERVAL = 10; final static int PING_INTERVAL = 10;
boolean firstPost = true;
public Metrics()
{
super( "Metrics Gathering Thread" );
setDaemon( true );
}
@Override @Override
public void run() public void run()
{ {
boolean firstPost = true; try
while ( true )
{ {
try // We use the inverse of firstPost because if it is the first time we are posting,
{ // it is not a interval ping, so it evaluates to FALSE
// We use the inverse of firstPost because if it is the first time we are posting, // Each time thereafter it will evaluate to TRUE, i.e PING!
// it is not a interval ping, so it evaluates to FALSE postPlugin( !firstPost );
// Each time thereafter it will evaluate to TRUE, i.e PING!
postPlugin( !firstPost );
// After the first post we set firstPost to false // After the first post we set firstPost to false
// Each post thereafter will be a ping // Each post thereafter will be a ping
firstPost = false; firstPost = false;
} catch ( IOException ex ) } catch ( IOException ex )
{ {
ProxyServer.getInstance().getLogger().info( "[Metrics] " + ex.getMessage() ); ProxyServer.getInstance().getLogger().info( "[Metrics] " + ex.getMessage() );
}
try
{
sleep( PING_INTERVAL * 1000 * 60 );
} catch ( InterruptedException ex )
{
break;
}
} }
} }