xxl_job-微信小程序无法登录

运营反馈用户登录不上微信小程序,提示错误:“获取不到手机号”。

研发接到反馈后根据错误信息,查询日志,发现是调用“微信接口获取手机号接口”异常,没有返回手机号。

1、排查问题

1.1、“微信接口获取手机号接口”需要两个参数,一个是前端微信小程序返回的code,一个是服务端的access_token。

1.2、C端小程序最近一周没有做个升级,因此怀疑是服务端access_token异常导致的“微信接口获取手机号接口”异常。

1.3、服务端使用的access_token是通过定时任务每个30分钟获取一次(定时任务刷新access_token到redis集群缓存),因此排查定时任务,查询最近一天执行的日志(这里就发现打印日志的好处,根据特定日志查询每个30分钟执行的情况

先止损,手动执行xxl_job任务

1.4、发现执行access_token刷新的特定日志在前一天就停止了,那就是xxl_job的问题了

1.5、排查xxl_job任务异常停止原因~~

2、xxl_job问题排查

被调度服务使用k8s管理,一共2个pod,其他可用1个pod,一个异常pod

查询xxl_job注册调用服务日志,发现异常pod也可以注册到xxl_job中。

大概率是异常pod注册到xxl_job后,xxl_job下发任务到了异常pod导致问题。

2.1、为什么异常pod会注册到xxl_job?

服务提供方对xxl_job进行了spring boot starter封装,服务在定时任务注册到xxl_job成功的后续流程中遇到了失败,导致服务并没有重启成功,一直夯住了。

导致xxl_job可以看到异常pod注册到了xxl_job中。

2.2、xxl_job下发任务后什么情况会显示执行成功?分析源码的时间到了~~

定时任务执行逻辑:

定时执行或者手动执行都会调用com.xxl.job.core.biz.impl.ExecutorBizImpl#run方法,

ExecutorBizImpl#run会根据运行模式(bean等)判断具体的执行方式,

包括创建IJobHandler,分为几种情况

  • 根据jobId从jobThreadRepository中获取已有的JobThread
  • 根据TriggerParam指定executorHandler名称从jobHandlerRepository获取JobThread,这里指定executorHandler名称都是服务启动时注册到xxl_job的执行器。
  • 创建一个新的JobThread,添加到jobThreadRepository

获取jobThread后把TriggerParam推送到JobThread线程队列中(com.xxl.job.core.thread.JobThread#pushTriggerQueue)。

这里就是显示成功地方:只要推送到队列中就返回成功。

 

    public ReturnT<String> pushTriggerQueue(TriggerParam triggerParam) {
        // avoid repeat
        if (triggerLogIdSet.contains(triggerParam.getLogId())) {
            logger.info(">>>>>>>>>>> repeate trigger job, logId:{}", triggerParam.getLogId());
            return new ReturnT<String>(ReturnT.FAIL_CODE, "repeate trigger job, logId:" + triggerParam.getLogId());
        }

        triggerLogIdSet.add(triggerParam.getLogId());
        triggerQueue.add(triggerParam);
        return ReturnT.SUCCESS;
    } 

 

posted @ 2024-04-30 10:25  使用D  阅读(17)  评论(0编辑  收藏  举报