AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

Springboot自定義重試注解@Retryable

來源: 責編: 時間:2023-10-13 14:37:58 291觀看
導讀一、概述微服務之間相互調用,難免會出現形形色色的異常,出現異常時有些情況可能需要先落重試任務表,然后通過任務調度等進行定時重試;通過自定義重試注解@Retryable,減少對核心業務代碼入侵,增強代碼可讀性、可維護性。下面

Y1r28資訊網——每日最新資訊28at.com

一、概述

微服務之間相互調用,難免會出現形形色色的異常,出現異常時有些情況可能需要先落重試任務表,然后通過任務調度等進行定時重試;通過自定義重試注解@Retryable,減少對核心業務代碼入侵,增強代碼可讀性、可維護性。下面通過實戰,開發自定義重試注解@Retryable。諸位可根據業務需要,稍作改造直接使用;如果有疑問、或者好的想法,歡迎留言,經驗共享。Y1r28資訊網——每日最新資訊28at.com

二、實戰

重試任務表定義(retry_task):Y1r28資訊網——每日最新資訊28at.com

CREATE TABLE `retry_task` (  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵值',  `business_type_code` varchar(32) COLLATE NOT NULL DEFAULT '' COMMENT '業務類型編碼',  `business_type_desc` varchar(100) COLLATE NOT NULL DEFAULT '' COMMENT '業務類型描述',  `retry_service_name` varchar(100) COLLATE NOT NULL DEFAULT '' COMMENT '重試的service名稱',  `business_param` text COLLATE NOT NULL DEFAULT '' COMMENT '業務參數',  `wait_retry_times` int(11) NOT NULL DEFAULT 3 COMMENT '待重試次數',  `already_retry_times` int(11) NOT NULL DEFAULT 0 COMMENT '已重試次數',  `retry_result_code` varchar(36) COLLATE NOT NULL DEFAULT '' COMMENT '重試結果碼',  `retry_result_msg` varchar(255) COLLATE NOT NULL DEFAULT '' COMMENT '重試結果描述',  `create_user` varchar(36) COLLATE NOT NULL DEFAULT '' COMMENT '創建人',  `create_time` datetime NOT NULL COMMENT '創建時間',  `update_user` varchar(36) COLLATE NOT NULL DEFAULT '' COMMENT '更新人',  `update_time` datetime NOT NULL COMMENT '更新時間',  PRIMARY KEY (`id`),  KEY `idx_create_time` (`create_time`),  KEY `idx_business_type_code` (`business_type_code`)) COMMENT='重試任務表';

重試任務表實體類(RetryTaskEntity):Y1r28資訊網——每日最新資訊28at.com

@Datapublic class RetryTaskEntity implements Serializable {    private static final long serialVersionUID = -1950778520234119369L;    /**     * 主鍵值     */    private BigInteger id;    /**     * 業務類型編碼     */    private String businessTypeCode;    /**     * 業務類型描述     */    private String businessTypeDesc;    /**     * 重試的service名稱     */    private String retryServiceName;    /**     * 業務參數     */    private String businessParam;    /**     * 待重試的次數     */    private Integer waitRetryTimes;    /**     * 已重試的次數     */    private Integer alreadyRetryTimes;    /**     * 重試結果碼     */    private String retryResultCode;    /**     * 重試結果描述     */    private String retryResultMsg;    /**     * 創建人     */    private String createUser;    /**     * 創建時間     */    private Date createTime;    /**     * 更新人     */    private String updateUser;    /**     * 更新時間     */    private Date updateTime;}

重試任務表mapper和對應的xml文件:Y1r28資訊網——每日最新資訊28at.com

public interface RetryTaskMapper {    int addRetryTask(RetryTaskEntity retryTaskEntity);}
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.boot.demo.mapper.RetryTaskMapper">    <insert id="addRetryTask" parameterType="com.boot.demo.pojo.RetryTaskEntity">        INSERT INTO retry_task(business_type_code,                               business_type_desc,                               retry_service_name,                               business_param,                               wait_retry_times,                               already_retry_times,                               retry_result_code,                               retry_result_msg,                               create_user,                               create_time,                               update_user,                               update_time)        VALUES (#{businessTypeCode},                #{businessTypeDesc},                #{retryServiceName},                #{businessParam},                #{waitRetryTimes},                #{alreadyRetryTimes},                #{retryResultCode},                #{retryResultMsg},                #{createUser},                #{createTime},                #{updateUser},                #{updateTime})    </insert></mapper>

重試任務表service和對應的serviceImpl:Y1r28資訊網——每日最新資訊28at.com

public interface RetryTaskService {    void addRetryTask(RetryTaskEntity retryTaskEntity);}
@Servicepublic class RetryTaskServiceImpl implements RetryTaskService {    @Autowired    private RetryTaskMapper retryTaskMapper;    @Override    public void addRetryTask(RetryTaskEntity retryTaskEntity) {        retryTaskMapper.addRetryTask(retryTaskEntity);    }}

業務類型枚舉類(RetryTaskDefinitionEnum):Y1r28資訊網——每日最新資訊28at.com

/** * 重試任務枚舉 */public enum RetryTaskDefinitionEnum {    ADD_STOCK("101", "采購入庫成功后新增庫存異常重試", "purchaseService", 3);    /**     * 業務類型編碼     */    private final String businessTypeCode;    /**     * 業務類型描述     */    private final String businessTypeDesc;    /**     * 重試的service名稱     */    private final String retryServiceName;    /**     * 重試次數     */    private final Integer retryTimes;    RetryTaskDefinitionEnum(String businessTypeCode, String businessTypeDesc, String retryServiceName, Integer retryTimes) {        this.businessTypeCode = businessTypeCode;        this.businessTypeDesc = businessTypeDesc;        this.retryServiceName = retryServiceName;        this.retryTimes = retryTimes;    }    public static RetryTaskDefinitionEnum getTaskDefinitionByBusinessTypeCode(String businessTypeCode) {        if (StringUtils.isBlank(businessTypeCode)) {            return null;        }        for (RetryTaskDefinitionEnum taskDefinition : values()) {            if (taskDefinition.getBusinessTypeCode().equals(businessTypeCode)) {                return taskDefinition;            }        }        return null;    }    public String getBusinessTypeCode() {        return businessTypeCode;    }    public String getBusinessTypeDesc() {        return businessTypeDesc;    }    public String getRetryServiceName() {        return retryServiceName;    }    public Integer getRetryTimes() {        return retryTimes;    }}

自定義注解(@MyRetryable):Y1r28資訊網——每日最新資訊28at.com

import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)@Inherited@Documentedpublic @interface MyRetryable {    RetryTaskDefinitionEnum businessType();}

自定義注解切面(MyRetryableAspect):Y1r28資訊網——每日最新資訊28at.com

import com.alibaba.fastjson.JSON;import lombok.extern.slf4j.Slf4j;import com.boot.demo.result.Result;import com.boot.demo.result.ResultCode;import com.boot.demo.pojo.RetryTaskEntity;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import com.boot.demo.annotation.MyRetryable;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.ProceedingJoinPoint;import com.boot.demo.service.RetryTaskService;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.stereotype.Component;import com.boot.demo.annotation.RetryTaskDefinitionEnum;import org.springframework.beans.factory.annotation.Autowired;import java.util.Date;@Slf4j@Aspect@Componentpublic class MyRetryableAspect {    @Autowired    private RetryTaskService retryTaskService;    @Pointcut("@annotation(com.boot.demo.annotation.MyRetryable)")    public void pointCut() {    }    @Around(value = "pointCut()")    public Object around(ProceedingJoinPoint joinPoint) {        Result result = null;        try {            // 執行目標方法            result = (Result) joinPoint.proceed();            // 目標方法返回:成功結果碼(200),則無需重試            if (ResultCode.SUCCESS.getCode() == result.getCode()) {                return result;            }            // 目標方法返回:非成功結果碼(非200)則需重試(此次可根據需要判斷什么樣的返回碼需要重試)            dealAddRetryTask(joinPoint);,            return result;        } catch (Throwable e) {            log.error("myRetryableAspectLog error param: {} result: {} e: ", joinPoint.getArgs(), result, e);            // 此處捕獲異常之后,也可以根據需要重試,這里就僅輸出異常日志            return result;        }    }    private void dealAddRetryTask(ProceedingJoinPoint joinPoint) {        // 獲取重試注解信息        MyRetryable myRetryableAnnotation = ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(MyRetryable.class);        if (null == myRetryableAnnotation) {            return;        }        // 根據業務類型編碼,獲取枚舉中定義的業務類型描述、重試的service、重試次數等信息        String businessTypeCode = myRetryableAnnotation.businessType().getBusinessTypeCode();        RetryTaskDefinitionEnum retryTaskDefinition = RetryTaskDefinitionEnum.getTaskDefinitionByBusinessTypeCode(businessTypeCode);        if (null == retryTaskDefinition) {            return;        }        RetryTaskEntity retryTaskEntity = new RetryTaskEntity();        retryTaskEntity.setBusinessTypeCode(businessTypeCode);        retryTaskEntity.setBusinessTypeDesc(retryTaskDefinition.getBusinessTypeDesc());        retryTaskEntity.setRetryServiceName(retryTaskDefinition.getRetryServiceName());        retryTaskEntity.setBusinessParam(JSON.toJSONString(joinPoint.getArgs()[0]));        retryTaskEntity.setWaitRetryTimes(retryTaskDefinition.getRetryTimes());        retryTaskEntity.setAlreadyRetryTimes(0);        retryTaskEntity.setRetryResultCode("");        retryTaskEntity.setRetryResultMsg("");        retryTaskEntity.setCreateUser("SYS");        retryTaskEntity.setCreateTime(new Date());        retryTaskEntity.setUpdateUser("SYS");        retryTaskEntity.setUpdateTime(new Date());        retryTaskService.addRetryTask(retryTaskEntity);    }}

基礎類(Result、ResultCode、ResultGenerator)。Y1r28資訊網——每日最新資訊28at.com

Result類:Y1r28資訊網——每日最新資訊28at.com

public class Result {    private int code;    private String message;    private Object data;    public Result setCode(ResultCode resultCode) {        this.code = resultCode.getCode();        return this;    }    public int getCode() {        return code;    }    public Result setCode(int code) {        this.code = code;        return this;    }    public String getMessage() {        return message;    }    public Result setMessage(String message) {        this.message = message;        return this;    }    public Object getData() {        return data;    }    public Result setData(Object data) {        this.data = data;        return this;    }    @Override    public String toString() {        final StringBuilder sb = new StringBuilder("Result{");        sb.append("code=").append(code);        sb.append(", message='").append(message).append('/'');        sb.append(", data=").append(data);        sb.append('}');        return sb.toString();    }}

ResultCode類:Y1r28資訊網——每日最新資訊28at.com

public enum ResultCode {    SUCCESS(200),    FAIL(400),    UNAUTHORIZED(401),    FORBIDDEN(403),    NOT_FOUND(404),    INTERNAL_SERVER_ERROR(500);    private final int code;    ResultCode(int code) {        this.code = code;    }    public int getCode() {        return code;    }}

ResultGenerator類:Y1r28資訊網——每日最新資訊28at.com

public class ResultGenerator {    private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";    private ResultGenerator() {    }    public static Result genSuccessResult() {        return new Result().setCode(ResultCode.SUCCESS).setMessage(DEFAULT_SUCCESS_MESSAGE);    }    public static Result genSuccessResult(Object data) {        return new Result().setCode(ResultCode.SUCCESS).setMessage(DEFAULT_SUCCESS_MESSAGE).setData(data);    }    public static Result genFailResult(String message) {        return new Result().setCode(ResultCode.FAIL).setMessage(message);    }    public static Result genFailResult(ResultCode code, String message) {        return new Result().setCode(code).setMessage(message);    }    public static Result genFailResult(String message, Object data) {        return new Result().setCode(ResultCode.FAIL).setMessage(message).setData(data);    }}

測試controller(PurchaseController):Y1r28資訊網——每日最新資訊28at.com

@RestController@RequestMapping("/purchase")public class PurchaseController {    @Autowired    private PurchaseService purchaseService;    @GetMapping("/test")    public String test(String param) {        purchaseService.addStock(param);        return "success";    }}

測試PurchaseService、和PurchaseServiceImplY1r28資訊網——每日最新資訊28at.com

public interface PurchaseService {    Result addStock(String param);}
@Service("purchaseService")public class PurchaseServiceImpl implements PurchaseService {    @Override    // 在需要重試的業務方法上新增重試注解即可    @MyRetryable(businessType = RetryTaskDefinitionEnum.ADD_STOCK)    public Result addStock(String param) {//     return ResultGenerator.genSuccessResult();        return ResultGenerator.genFailResult("系統異常...");    }}

三、總結

新增重試任務成功之后,我們可通過調度平臺(比如:xxlJob),定時查詢重試任務表,然后調用RetryTaskDefinitionEnum中定義的重試的service(retryServiceName),這里可以定義一個模板方法,根據retryServiceName,從spring中獲取到對應的bean,執行具體的業務方法,然后更新任務狀態和重試次數即可。Y1r28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-13357-0.htmlSpringboot自定義重試注解@Retryable

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 聊聊 Reddit Programming 板塊的未來

下一篇: Java遍歷一個 List 有哪些方式?每種的實現原理以及哪種最高效?

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 跑分安卓第一!Redmi K60至尊版8月發布!盧偉冰:目標年度性能之王

    8月5日消息,Redmi K60至尊版將于8月發布,在此前舉行的戰略發布會上,官方該機將搭載搭載天璣9200+處理器,安兔兔V10跑分超177萬分,是目前安卓陣營最高的分數
  • 28個SpringBoot項目中常用注解,日常開發、求職面試不再懵圈

    前言在使用SpringBoot開發中或者在求職面試中都會使用到很多注解或者問到注解相關的知識。本文主要對一些常用的注解進行了總結,同時也會舉出具體例子,供大家學習和參考。注解
  • 從 Pulsar Client 的原理到它的監控面板

    背景前段時間業務團隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產者消息發送緩慢等各種問題。雖然我們有個監控頁面可以根據 topic 維度查看他的發送狀態,
  • 三萬字盤點 Spring 九大核心基礎功能

    大家好,我是三友~~今天來跟大家聊一聊Spring的9大核心基礎功能。話不多說,先上目錄:圖片友情提示,本文過長,建議收藏,嘿嘿嘿!一、資源管理資源管理是Spring的一個核心的基礎功能,不
  • Python異步IO編程的進程/線程通信實現

    這篇文章再講3種方式,同時講4中進程間通信的方式一、 Python 中線程間通信的實現方式共享變量共享變量是多個線程可以共同訪問的變量。在Python中,可以使用threading模塊中的L
  • 2納米決戰2025

    集微網報道 從三強爭霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來。無論是老牌勁旅臺積電、三星,還是誓言重回先進制程領先地位的英特爾,甚至初成立不久的新
  • 蘋果140W USB-C充電器:采用氮化鎵技術

    據10 月 30 日 9to5 Mac 消息報道,當蘋果推出新的 MacBook Pro 2021 時,該公司還推出了新的 140W USB-C 充電器,附贈在 MacBook Pro 16 英寸機型的盒子里,也支
  • 中關村論壇11月25日開幕,15位諾獎級大咖將發表演講

    11月18日,記者從2022中關村論壇新聞發布會上獲悉,中關村論壇將于11月25至30日在京舉行。本屆中關村論壇由科學技術部、國家發展改革委、工業和信息化部、國務
Top