记一次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解决掉了,业务便能正常运行了。

猜你喜欢

转载自www.cnblogs.com/bzfsdr/p/11940241.html