@Configuration("asynTimerTaskController")
@Scope(value ="prototype") //为什么用了prototype之后,@autowired的threadPoolTaskScheduler就不能创建了????
public class AsynTimerTaskController {
// @Autowired
// @Resource
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
// @PostConstruct
// public void initpool()
// {
// threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
// }
@Bean(name = "threadPoolTaskScheduler") //(initMethod = "initpool")
// @Scope(scopeName = "prototype")
public ThreadPoolTaskScheduler threadPoolTaskScheduler()
{
threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(2);
return threadPoolTaskScheduler;
}
//在ScheduledFuture中有一个cancel方法可以停止定时任务 要看源码
private ScheduledFuture<?> future;
public String start( Runnable runnable,long period)
{
if(threadPoolTaskScheduler == null)
threadPoolTaskScheduler = ApplicationContextProvider.getBean("threadPoolTaskScheduler", ThreadPoolTaskScheduler.class);
// threadPoolTaskScheduler = threadPoolTaskScheduler(); //这种做法,下一句就异常了
future = threadPoolTaskScheduler.scheduleAtFixedRate(runnable,period);//500ms
return "startok";
}
public String stop()
{
if(future!=null)
future.cancel(true);
return "stopok";
}
public String edit(Runnable runnable,long period)
{
stop();
future = threadPoolTaskScheduler.scheduleAtFixedRate(runnable,period);
return "editok";
}
public void destry()
{
System.out.println("AsynTimerTaskController.....destry......");
}
}
原来的代码中没有threadPoolTaskScheduler.setPoolSize(2);这一句,因为是prototype,所以是多实例的。做实验的时候,有一个定时器(这是这个定时类的一个实例,名称为A吧),定时器的任务中再获取一个AsynTimerTaskController实例B,结果发现B中的任务无法运行,后来将setPoolSize这句加上之后一切正常了。
来源:oschina
链接:https://my.oschina.net/u/2963604/blog/4821480