docs: @Override
  	protected void doStart() throws Exception {
  		logger.debug("Start with configuration: defaultCoreSize={}, defaultMaxSize={}, defaultKeepAliveSeconds={}, defaultQueueSize={}, defaultAllowCoreThreadTimeout={}, shutdownWaitSeconds={}", 
  				defaultCoreSize, defaultMaxSize, defaultKeepAliveSeconds, defaultQueueSize, defaultAllowCoreThreadTimeout, shutdownWaitSeconds);
  		this.threadPools = new PutIfAbsentMap<String, ThreadPoolExecutor>(new HashMap<String, ThreadPoolExecutor>(),
  				new MapValueFactory<String, ThreadPoolExecutor>(){
  					@Override
  					public ThreadPoolExecutor createValue(String key) {
  						int coreSize = configurationsResolver.getProperty(configurationsCommonPrefix + key + ".coreSize", Integer.class, defaultCoreSize);
  						int maxSize = configurationsResolver.getProperty(configurationsCommonPrefix + key + ".maxSize", Integer.class, defaultMaxSize);
  						long keepAliveSeconds = configurationsResolver.getProperty(configurationsCommonPrefix + key + ".keepAliveSeconds", Long.class, defaultKeepAliveSeconds);
  						int queueSize = configurationsResolver.getProperty(configurationsCommonPrefix + key + ".queueSize", Integer.class, defaultQueueSize);
  						boolean allowCoreThreadTimeout = configurationsResolver.getProperty(configurationsCommonPrefix + key + ".allowCoreThreadTimeout", Boolean.class, defaultAllowCoreThreadTimeout);
  
  						ThreadFactory threadFactory = new BasicThreadFactory.Builder().namingPattern(key + "-%04d").build();
  						ThreadPoolExecutor pool;
  						if (key.contains(KEYWORD_SCHEDULED) || key.contains(KEYWORD_SCHD)){
  							ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(coreSize, threadFactory);
  							setRemoveOnCancelPolicy(p, true);
  							pool = p;
  							logger.debug("Created scheduled thread pool '{}': size={}",key, coreSize);
  						}else{
  							pool = new ThreadPoolExecutor(coreSize, maxSize, 
  									keepAliveSeconds, TimeUnit.SECONDS, queueSize < 10000000 ? new ArrayBlockingQueue<Runnable>(queueSize) : new LinkedBlockingQueue<Runnable>(queueSize),
  									threadFactory);
  							pool.allowCoreThreadTimeOut(allowCoreThreadTimeout);
  							logger.debug("Created thread pool '{}': coreSize={}, maxSize={}, keepAliveSeconds={}, queueSize={}, allowCoreThreadTimeout={}", 
  									key, coreSize, maxSize, keepAliveSeconds, queueSize, allowCoreThreadTimeout);
  						}
  						return pool;
  					}
  		});
  	}