quartz定时任务突然不执行了

高并发情况下,quartz定时任务突然不执行了,
背景:
整个项目架构,高并发操作比较多,
有多个线程池,周期线程池,和定时任务,占用多个资源
导致现场出现定时任务走一段时间就不走的情况
当前定时任务配置的是单线程(concurrent 属性值false)
排查过程:
利用Java VisualVM (windows操作系统)
查看现场线程日志和堆日志,没结果
线程数没有达到中间件配置的顶峰,应用日志也没有报错
进一步查应用源码,发现在定时任务中进行了http请求,排查是否写了超时时间,超时时间15秒,也没问题,
最后猜测是quartz本身的bug,因为我用的是quartz1.6.1,配置的执行时间是10秒一次,然后你的每次任务执行的时间都超过10秒之后,定时任务就一直往后延迟时间,等你当前任务完成后,再过10秒再执行,
修改方案,一个馊注意---------把时间改长一点,写30秒,或者1分钟,目前看现场问题解决好一些的方案,就是升级版本1.6.3
另外,我的思路是,可否给定时任务加个超时时间,就是每个任务执行时间超过一定值,就杀死这个任务,执行下一个任务,最后发现定时任务没有超时机制
另寻其他方法:
利用周期线程池ScheduledExecutorService ,和Future接口的get方法设置超时时间,亲测有效
(@PostConstruct注解,配置方法在类加载的时候执行,)

@Component 
public class MyScheduledExecutorService {
	private ScheduledExecutorService sendExecutor;

	@PostConstruct//Spring加载这个类的时候执行一次
	private void init() {
		ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
		service.scheduleAtFixedRate(new Runner(), 0, 20, TimeUnit.SECONDS);
	}

	private static final Log logger = LogFactory.getLog(DelaySendSmsZg.class);

	public static void task() {
		//你的业务
	}

	private static class Caller implements Callable<String> {
		@Override
		public String call() {
			try {
				taskSend();
				return "";
			} catch (Exception e) {
				e.printStackTrace();
			}
			return null;
		}
	}

	private static class Runner implements Runnable {
		@Override
		public void run() {
			ExecutorService excutor = Executors.newSingleThreadExecutor();
			Future<String> future = excutor.submit(new Caller());
			try {
				future.get(20, TimeUnit.SECONDS);// 超过20秒没执行完,直接终止
			} catch (TimeoutException e) {
				logger.info("xx超时");
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				excutor.shutdownNow(); // 强制终止任务
			}
		}
	}

	public static void main(String[] args) {
		ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
		service.scheduleAtFixedRate(new Runner(), 0, 1, TimeUnit.SECONDS);
	}


}

你可能感兴趣的:(java基础)