我开发了一套分布式接口重推系统
功能介绍
业务开发中会有方法重推的需求,比如调用第三方系统接口,如果调用失败,需要能够重推,重推后需要更新业务信息,例如业务单据的状态更新为:推送失败(成功)。
因此决定写一套通用的接口重推功能,能实现自动重推和手动重推。并且记录的接口调用的信息。
该功能模块目录如下:
主要功能为:1。在需要记录日志的方法上面添加注解2。调用方法,调用信息记录数据库3。调用重试方法,重试调用异常方法
日志记录注解
注解EnableLog说明:Target({ElementType。METHOD})Retention(RetentionPolicy。RUNTIME)DocumentedpublicinterfaceEnableLog{OperationTypetype();接口提供方returnStringprovider();StringcurrentSystem()defaultStringUtils。EMPTY;类型IN本系统对外apiorOUT调的外部接口returnModelTypemodel();成功标志StrreturnStringsuccessStr()defaultStringUtils。EMPTY;允许重试次数,默认1,即可无限重试returnlongallowRetry()default1;是否自动重试0否returnStringneedAuto()defaultSystemConstant。NO;方法描述returnStringdesc()defaultStringUtils。EMPTY;}
调用示例EnableLog(typeOperationType。INSERT,providerOA,modelModelType。OUT,successStrsuccess,descOA接口消息提醒)publicStringsendNotify(OaTaskMessageoaTaskMessage){OaMessageParamoaMessageParamBeanUtils。copy(oaTaskMessage,OaMessageParam。class);oaMessageParam。setOpenMode(5);oaMessageParam。setModuleCode(srm);oaMessageParam。setMsgType(1);returnoaApiClient。sendMessage(oaMessageParam);}
参数说明:1。type:目标方法的操作类型。增,删,改,查2。provider:接口来源方3。model:IN本系统对外apiorOUT调的外部接口4。successStr:指定接口调成功的返回5。目标方法的描述重试方法(手动)
如果标出的方法调用异常,那么就可以执行这个重试方法。该方法主要执行逻辑为:1。在日志记录表获取指定主键id的异常状态方法调用记录2。重复执行次数校验3。反射执行方法4。更细记录状态重试方法(自动)
该系统默认手动重试,如果在EnableLog注解中我们设置needAutotrue,那么系统自动重试,自动重试功能如下对注解标注的方法放入redis阻塞队列异常重试线程消费阻塞队列
放入异常队列exceptionResultQueueService。pushExceptionQueue(logId);
重试线程消费阻塞队列中的值:privatevoidloop(){StringnameThread。currentThread()。getName();log。info(异常方法重试线程启动,当前线程:【{}】,name);while(!Thread。interrupted()){StringapiLogId(String)redisUtils。blockRightPop(EXCEPTIONQUEUEKEY);LogExecutor。LogMethodParamparamnewLogExecutor。LogMethodParam();param。setLogId(apiLogId);logExecutor。executorMethod(param);每隔5s循环一次。减少资源消耗try{Thread。sleep(5000);}catch(InterruptedExceptione){e。printStackTrace();}}}异常重试后业务处理扩展
如果重新执行方法后需要处理业务逻辑,可以使用这个扩展接口ComponentpublicclassExampleRetryResultHandlerimplementsRetryResultHandler{OverridepublicStringresultHandler(Objectobj){重试方法执行后业务处理returnnull;}OverridepublicStringinvokeMethodStr(){returnexample;}OverridepublicStringmethodName(){returnsendTaskMessage;}}
只需实现RetryResultHandler接口即可。
RetryResultHandler说明如下:publicinterfaceRetryResultHandler{方法结果处理器paramobjreturnStringresultHandler(Objectobj);该方法的父层调用方法,全路径returnStringinvokeMethodStr();Enable注解标注的方法名称returnStringmethodName();}
业务处理逻辑写在resultHandler()方法即可。invokeMethodStr()为该方法的父层方法(全路径),methodName()为该方法的方法名称。
至此,一套方法日志记录,方法重试的系统完成。分布式系统调用
在分布式系统中,各系统如何调用这个公用的重试方法呢,我们需要将上述功能封装到一个SDK中,需要调用的系统就引入这个SDK。各业务系统中引入SDK后编写Controller层方法:RestControllerRequestMapping(apiLog)publicclassApiLogController{AutowiredprivateSysLogApiClientsysLogApiClient;执行调用异常的方法returnApiMetadata(actionName执行调用异常的方法,permissionLevelPermissionLevel。PermissionRequired)PostMapping(valueexecutorExceptionMethod)ResponseBodypublicObjectexecutorExceptionMethod(RequestBodyLogMethodParamparam){returnsysLogApiClient。executorExceptionMethod(param);}}
同时我们需要一个公共服务,该公共服务需要写一个共前端调用的重试接口,前端传入logId,通过路由执行各个业务系统中SDK的executorExceptionMethod方法。
这样就可以实现在分布式系统中调用公共方法去执行重试了。
本篇内容到这里就结束了,如果内容对你有帮助,欢迎点赞收藏。
每日微语01一切都在快速地改变一切都在快速地改变,不停地变迁,拥有的也将会失去,我们能把握住什么?这个生命本来也是不存在的,一切都是无中生有,终有一天也将回到虚无中去。人靠不住,物也会失去,这个身体也会老病死,
你理想和仰望的生活,正在成为你的愤怒之源头条创作挑战赛最近频繁出现这样一段话你敬畏天理,他崇拜权威,这是世界观不同你站在良知一边,他站在赢者一边,这是价值观不同你努力是为理想的生活,他努力是为做人上人,这是人生观不同。听
基础教育高质量发展需在师生身上见实效本报记者贺春兰人民政协报(2022年11月23日第09版)加快推进教育高质量发展,是党的二十大对教育提出的根本要求。而推进基础教育高质量发展,必需落实到每一所中小学和幼儿园。必需真
长沙新媒体旅游推荐官刘纯伟长沙,读你千遍也不厌倦资深自驾旅行博主刘纯伟。红网时刻新闻记者彭超长沙报道寻找美景追求诗意,不一定要去远方。读长沙的感觉像三月,浪漫的季节,醉人的诗篇在土生土长的长沙人刘纯伟看来,长沙就像一首诗一本书,
为爱冲锋的竟是我?男女主和好开始带货,网友吐槽好像被耍了头条创作挑战赛上大学以后,学生们迎来了最精彩的校园生活,除了上课,还有很多有意义的活动,可谓乐不思蜀,大学虽然学业不太紧张,但学生也只能一学期回家一趟,和家人的距离被拉开,感情可能
江苏爷爷辅导孙子气到拍桌子,孙子蹦蹦跳跳,母亲忍不住笑了教育孩子这件事情上,最让家长头疼的还是辅导孩子写作业。平时性格温和的家长,辅导作业以后也可能会非常容易暴走。看着孩子的父母辅导作业时如此的暴躁,作为爷爷奶奶都觉得是父母问题,认为父
论冬季养生冬季养生瞅一瞅,活到九十九论冬季养生冬季是一个闭藏的季节,水因寒而冰冻,地因寒而坼裂,万物都潜伏起来,故称为闭藏。适应冬天藏气的调养,人们应早睡晚起,等到日光出现再起床,避免严寒,保持温暖,不要使皮肤开泄出
肝肾亏虚,白发脱发,你需要来这碗羹首乌芝麻核桃黑豆羹材料制首乌30g,黑芝麻50g,核桃肉100g,黑豆50g制法材料洗净,向锅内加入适量清水煮沸,納入制首乌煮30分钟,捞起首乌,再把黑豆核桃肉及芝麻放入搅拌机打成
秋冬季节,嘴唇干燥皲裂出血疼痛怎么办?一年四季嘴唇都很干,尤其到了秋冬季节,更加严重,只要说话时嘴唇开合过大或是大笑,就会导致嘴唇开裂出血。这些年里,每天勤喝水敷唇膜涂润唇膏,什么办法都用过了,但嘴唇还是老样子,问该怎
孩子不爱吃饭怎么办?一招就搞定逐渐迎来冬天了!家长们又该担心孩子们上学吃不好穿不暖了,上学前夕陆续给孩子准备各种营养补充和代餐零食那甄补要赶紧准备起来了别问为什么,因为这已经成了孩子们的团宠代餐饮了,不仅味道好
孩子本无优劣生命至上,这里的生命,指的不是阿猫阿狗的生命,是人的生命。无论一个人地位高低贫穷富裕健康羸弱,都是一个生命。这在现代社会是一个共识。生命也没有优劣,那些刻意强调生命优劣的人,比如纳