Rework shutdown sequence to close #391
This commit is contained in:
parent
0cd4c9030c
commit
0578f94522
@ -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 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user