| 
					
				 | 
			
			
				@@ -0,0 +1,30 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package com.genersoft.iot.vmp.conf; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.commons.lang3.concurrent.BasicThreadFactory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.context.annotation.Configuration; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.scheduling.annotation.SchedulingConfigurer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.scheduling.config.ScheduledTaskRegistrar; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.concurrent.ScheduledThreadPoolExecutor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.concurrent.ThreadPoolExecutor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * "@Scheduled"是Spring框架提供的一种定时任务执行机制,默认情况下它是单线程的,在同时执行多个定时任务时可能会出现阻塞和性能问题。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 为了解决这种单线程瓶颈问题,可以将定时任务的执行机制改为支持多线程 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@Configuration 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class ScheduleConfig implements SchedulingConfigurer { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public static final int cpuNum = Runtime.getRuntime().availableProcessors(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private static final int corePoolSize = cpuNum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private static final String threadNamePrefix = "scheduled-task-pool-%d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		taskRegistrar.setScheduler(new ScheduledThreadPoolExecutor(corePoolSize, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				new BasicThreadFactory.Builder().namingPattern(threadNamePrefix).daemon(true).build(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				new ThreadPoolExecutor.CallerRunsPolicy())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |