Add issue #215 - scheduler API

This commit is contained in:
md_5
2013-03-19 19:45:34 +11:00
parent 730c05aaad
commit 1edd27963f
6 changed files with 234 additions and 3 deletions

View File

@@ -1,5 +1,6 @@
package net.md_5.bungee;
import net.md_5.bungee.scheduler.BungeeScheduler;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
@@ -38,6 +39,7 @@ import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.connection.Server;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.api.plugin.PluginManager;
import net.md_5.bungee.api.scheduler.TaskScheduler;
import net.md_5.bungee.command.*;
import net.md_5.bungee.config.YamlConfig;
import net.md_5.bungee.netty.PipelineUtils;
@@ -69,9 +71,7 @@ public class BungeeCord extends ProxyServer
/**
* Thread pool.
*/
public final MultithreadEventLoopGroup eventLoops = new NioEventLoopGroup(
Runtime.getRuntime().availableProcessors() * 2,
new ThreadFactoryBuilder().setNameFormat( "Netty IO Thread - %1$d" ).build() );
public final MultithreadEventLoopGroup eventLoops = new NioEventLoopGroup( 0, new ThreadFactoryBuilder().setNameFormat( "Netty IO Thread - %1$d" ).build() );
/**
* locations.yml save thread.
*/
@@ -104,6 +104,8 @@ public class BungeeCord extends ProxyServer
private final Collection<String> pluginChannels = new HashSet<>();
@Getter
private final File pluginsFolder = new File( "plugins" );
@Getter
private final TaskScheduler scheduler = new BungeeScheduler();
{
@@ -252,10 +254,12 @@ public class BungeeCord extends ProxyServer
reconnectHandler.save();
saveThread.cancel();
// TODO: Fix this shit
getLogger().info( "Disabling plugins" );
for ( Plugin plugin : pluginManager.getPlugins() )
{
plugin.onDisable();
getScheduler().cancel( plugin );
}
getLogger().info( "Thank you and goodbye" );

View File

@@ -0,0 +1,77 @@
package net.md_5.bungee.scheduler;
import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import gnu.trove.TCollections;
import gnu.trove.iterator.TIntObjectIterator;
import gnu.trove.map.TIntObjectMap;
import gnu.trove.map.hash.TIntObjectHashMap;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.api.scheduler.ScheduledTask;
import net.md_5.bungee.api.scheduler.TaskScheduler;
public class BungeeScheduler implements TaskScheduler
{
private final AtomicInteger taskCounter = new AtomicInteger();
private final TIntObjectMap<BungeeTask> tasks = TCollections.synchronizedMap( new TIntObjectHashMap<BungeeTask>() );
private final ScheduledExecutorService executors = new ScheduledThreadPoolExecutor( 0, new ThreadFactoryBuilder().setNameFormat( "Bungee Scheduler Thread - %1$d" ).build() );
@Override
public void cancel(int id)
{
cancel( tasks.remove( id ) );
}
@Override
public void cancel(ScheduledTask task)
{
Preconditions.checkArgument( task instanceof BungeeTask, "Don't know how to handle task %s", task );
tasks.remove( task.getId() ).getFuture().cancel( false );
}
@Override
public int cancel(Plugin plugin)
{
int cancelled = 0;
for ( TIntObjectIterator<BungeeTask> iter = tasks.iterator(); iter.hasNext(); )
{
BungeeTask task = iter.value();
if ( task.getOwner() == plugin )
{
task.getFuture().cancel( false );
iter.remove();
cancelled++;
}
}
return cancelled;
}
@Override
public ScheduledTask runAsync(Plugin owner, Runnable task)
{
return schedule( owner, task, 0, TimeUnit.MILLISECONDS );
}
@Override
public ScheduledTask schedule(Plugin owner, Runnable task, long delay, TimeUnit unit)
{
return prepare( owner, task ).setFuture( executors.schedule( task, delay, unit ) );
}
@Override
public ScheduledTask schedule(Plugin owner, Runnable task, long delay, long period, TimeUnit unit)
{
return prepare( owner, task ).setFuture( executors.scheduleWithFixedDelay( task, delay, period, unit ) );
}
private BungeeTask prepare(Plugin owner, Runnable task)
{
int id = taskCounter.getAndIncrement();
return tasks.put( id, new BungeeTask( taskCounter.getAndIncrement(), owner, task ) );
}
}

View File

@@ -0,0 +1,32 @@
package net.md_5.bungee.scheduler;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.api.scheduler.ScheduledTask;
@Data
public class BungeeTask implements ScheduledTask
{
private final int id;
private final Plugin owner;
private final Runnable task;
@Setter(AccessLevel.NONE)
private ScheduledFuture<?> future;
@Override
public long getDelay(TimeUnit unit)
{
return future.getDelay( unit );
}
BungeeTask setFuture(ScheduledFuture<?> future)
{
this.future = future;
return this;
}
}