docs: protected AsyncTaskExecutor createDefaultTaskExecutor() {
  		String beanName = getBeanName();
  		ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
  		threadPoolTaskExecutor.setThreadNamePrefix(
  				beanName != null ? beanName + "-" : DEFAULT_THREAD_NAME_PREFIX);
  		int spinningThreads = this.getRegisteredQueues().size();
  
  		if (spinningThreads > 0) {
  			threadPoolTaskExecutor
  					.setCorePoolSize(spinningThreads * DEFAULT_WORKER_THREADS);
  
  			int maxNumberOfMessagePerBatch = getMaxNumberOfMessages() != null
  					? getMaxNumberOfMessages() : DEFAULT_WORKER_THREADS;
  			threadPoolTaskExecutor
  					.setMaxPoolSize(spinningThreads * (maxNumberOfMessagePerBatch + 1));
  		}
  
  		// No use of a thread pool executor queue to avoid retaining message to long in
  		// memory
  		threadPoolTaskExecutor.setQueueCapacity(0);
  		threadPoolTaskExecutor.afterPropertiesSet();
  
  		return threadPoolTaskExecutor;
  
  	}