程序日志停止滚动问题排查

今天在做定时任务的时候,遇到了一个比较难搞的问题,这个问题也比较有意思,现在给大家分享一下,这个定时任务的调用入口是这样的。

     // 进行 ldap同步
    public void  runLdapSyncJob(){
        try {
            ldapSyncService.syncLdap();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    这个方法ldapSyncService.syncLdap()向外抛出异常,这个方法内部会调用另一个方法
    /**
     * 创建部门目录并返回部门cn
     * @param departmentDtoMap
     * @param targetDepartId
     * @param rootCn
     * @return
     * @throws Exception
     */
    public  String creatStaffDepartCN(Map<Long,DepartmentDto> departmentDtoMap ,long targetDepartId,String rootCn, Set<String> ldapDUSet ) throws Exception {}

但是传入的参数中,第二个参数传入的是Long类型,而且是null,一开始没排查出来,因为一直加日志,在调用处,数据返回处,数据验证处都加日志了,但是通过定时任务管理平台执行任务之后方法执行到一定行数就什么也没有了,也没有日志,怀疑是可能有死循环(程序里写了while)结果top一下,发现cpu,内存都很正常,结合之前遇到的这种情况也看了下这个定时任务的进程中线程状态,看看有没有blocked或者死锁(单线程操作应该不会有死锁),发现也没有。这就尴尬了,于是想到了可能异常被框架或者jvm吃掉了,于是在上面两个方法里都加了try,catch

ldapSyncService.syncLdap() throws Exception{try{......}catch(Exception e){e.print();}}

creatStaffDepartCN() throws Exception{try{......}catch(Exception e){e.print();}}

再次部署执行之后发现确实有异常了,然后抛出了空指针,这里我恍然大悟,因为creatStaffDepartCN这个方法的第二个入参确实没有值传进去的。然后怀疑是否是因为自动装箱和拆箱过程中即使出现异常也会被jvm吃掉。本地简单写了一个demo,运行发现会报空指针。这里没有打印异常我判断有下面几种可能1.定时任务框架没有帮忙抛出。2.最外层的try,catch没有生效3.jvm把异常吃掉了

下面总结一下遇到程序日志停止滚动之后我们可以做的一些操作1.top看是否由于FGC等问题导致的服务停止响应2.jstack -l pid看一下进程内线程是否大量有blocked状态的线程3.在日志停止滚动的代码上下文增加try,catch语句尝试捕获异常。

        
        
        

本文由博客一文多发平台 OpenWrite 发布!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值