记一次job不跑的问题
Posted bzfsdr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次job不跑的问题相关的知识,希望对你有一定的参考价值。
就在昨晚app后台升级后,发现有个重要的job不跑了,导致业务无法正常的走下去。这时候心里慌得一批,但还好我们有多台服务器影响不大,屁话少说进入主题。
看了下job的实现,发现其使用了java.util.concurrent.Executor#execute来执行job
1 final CountDownLatch latch = new CountDownLatch(size); 2 for (final Orders orders : successfulSigning) { 3 threadPool.execute(new Runnable() { 4 @Override 5 public void run() { 6 try { 7 LOGGER.info("{} xxx job start", orders.getId()); 8 // 这里是业务逻辑 9 LOGGER.info("{} xxx job end", orders.getId()); 10 } catch (Exception e) { 11 LOGGER.error("发生了异常", e); 12 } finally { 13 latch.countDown(); 14 } 15 } 16 }); 17 } 18 latch.await();
查阅了日志,发现第7行的日志都未打印,这时候我便马上将问题定位到了threadPool上;为什么threadPool执行不了了,难道是池中的数量满了???
接下来我便去看了线程池定义的个数
1 private static ExecutorService threadPool = Executors.newFixedThreadPool(5);
好像也没啥问题,那为job为啥未执行到上述的7行呢,经过仔细的观察发现,此线程池还有其它的job在使用,而刚好有一个job卡住了,导致线程池没有释放掉,从而引起了其它job无法拿到资源执行自身逻辑!!!
最后我将那个卡主的job解决掉了,业务便能正常运行了。
以上是关于记一次job不跑的问题的主要内容,如果未能解决你的问题,请参考以下文章