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; }