package de.skuzzle.polly.core.internal.executors; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import de.skuzzle.jeve.EventProvider; import de.skuzzle.polly.core.configuration.ConfigurationProviderImpl; import de.skuzzle.polly.core.internal.ShutdownManagerImpl; import de.skuzzle.polly.core.moduleloader.AbstractProvider; import de.skuzzle.polly.core.moduleloader.ModuleLoader; import de.skuzzle.polly.core.moduleloader.annotations.Module; import de.skuzzle.polly.core.moduleloader.annotations.Provide; import de.skuzzle.polly.core.moduleloader.annotations.Require; import de.skuzzle.polly.sdk.AbstractDisposable; import de.skuzzle.polly.sdk.Configuration; import de.skuzzle.polly.sdk.exceptions.DisposingException; import de.skuzzle.polly.tools.concurrent.ThreadFactoryBuilder; @Module( requires = { @Require(component = ConfigurationProviderImpl.class), @Require(component = ShutdownManagerImpl.class) }, provides = { @Provide(component = EventProvider.class), @Provide(component = ExecutorService.class) }) public class ExecutorServiceProvider extends AbstractProvider { public ExecutorServiceProvider(ModuleLoader loader) { super("EXECUTOR_SERVICE_PROVIDER", loader, true); //$NON-NLS-1$ } @Override public void setup() { ConfigurationProviderImpl configProvider = this.requireNow(ConfigurationProviderImpl.class, true); Configuration pollyCfg = configProvider.getRootConfiguration(); ExecutorService eventThreadPool = Executors.newFixedThreadPool( pollyCfg.readInt(Configuration.EVENT_THREADS), new ThreadFactoryBuilder("EVENT_THREAD_%n%")); //$NON-NLS-1$ final EventProvider eventProvider = EventProvider.newAsynchronousEventProvider( eventThreadPool); final ExecutorService commandExecutor = Executors.newFixedThreadPool( pollyCfg.readInt(Configuration.EXECUTION_THREADS), new ThreadFactoryBuilder("EXECUTION_THREAD_%n%")); //$NON-NLS-1$ this.provideComponentAs(EventProvider.class, eventProvider); this.provideComponentAs(ExecutorService.class, commandExecutor); ShutdownManagerImpl shutdownManager = this .requireNow(ShutdownManagerImpl.class, true); shutdownManager.addDisposable(new AbstractDisposable() { @Override protected void actualDispose() throws DisposingException { eventProvider.close(); commandExecutor.shutdown(); } }); } }