最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Spring自定義注解實(shí)現(xiàn)任務(wù)路由的方法

 更新時(shí)間:2017年07月31日 11:41:06   作者:wangyan9110  
本篇文章主要介紹了使用Spring自定義注解實(shí)現(xiàn)任務(wù)路由的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在Spring mvc的開發(fā)中,我們可以通過RequestMapping來配,當(dāng)前方法用于處理哪一個(gè)URL的請(qǐng)求.同樣我們現(xiàn)在有一個(gè)需求,有一個(gè)任務(wù)調(diào)度器,可以按照不同的任務(wù)類型路由到不同的任務(wù)執(zhí)行器。其本質(zhì)就是通過外部參數(shù)進(jìn)行一次路由和Spring mvc做的事情類似。簡(jiǎn)單看了Spring mvc的實(shí)現(xiàn)原理之后,決定使用自定義注解的方式來實(shí)現(xiàn)以上功能。

自定義TaskHandler注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface TaskHandler {

  String taskType() default "";
}

以上定義了任務(wù)處理器的注解,其中@Component表示在spring 啟動(dòng)過程中,會(huì)掃描到并且注入到容器中。taskType表示類型。

任務(wù)處理器定義

public abstract class AbstractTaskHandler {

  /**
   * 任務(wù)執(zhí)行器
   *
   * @param task 任務(wù)
   * @return 執(zhí)行結(jié)果
   */
   public abstract BaseResult execute(Task task);
}

以上定義了一個(gè)任務(wù)執(zhí)行的處理器,其他所有的具體的任務(wù)執(zhí)行器繼承實(shí)現(xiàn)這個(gè)方法。其中Task表示任務(wù)的定義,包括任務(wù)Id,執(zhí)行任務(wù)需要的參數(shù)等。

任務(wù)處理器實(shí)現(xiàn)

接下來,我們可以實(shí)現(xiàn)一個(gè)具體的任務(wù)處理器。

@TaskHandler(taskType = "UserNameChanged")
public class UserNameChangedSender extends AbstractTaskHandler {
  @Override
  public BaseResult execute(Task task) {
   return new BaseResult();
  }
}

以上我們就實(shí)現(xiàn)一個(gè)用戶名修改通知的任務(wù)處理器,具體的業(yè)務(wù)邏輯這里沒有實(shí)現(xiàn)。

其中:@TaskHandler(taskType = "UserNameChanged"),這里我們指定這個(gè)Handler用于處理用戶名變更的任務(wù)

任務(wù)處理Handler注冊(cè)

public class TaskHandlerRegister extends ApplicationObjectSupport {

  private final static Map<String, AbstractTaskHandler> TASK_HANDLERS_MAP = new HashMap<>();

  private static final Logger LOGGER = LoggerFactory.getLogger(TaskHandlerRegister.class);

  @Override
  protected void initApplicationContext(ApplicationContext context) throws BeansException {
    super.initApplicationContext(context);
    Map<String, Object> taskBeanMap = context.getBeansWithAnnotation(TaskHandler.class);
    taskBeanMap.keySet().forEach(beanName -> {
      Object bean = taskBeanMap.get(beanName);
      Class clazz = bean.getClass();
      if (bean instanceof AbstractTaskHandler && clazz.getAnnotation(TaskHandler.class) != null) {
        TaskHandler taskHandler = (TaskHandler) clazz.getAnnotation(TaskHandler.class);
        String taskType = taskHandler.taskType();
        if (TASK_HANDLERS_MAP.keySet().contains(taskType)) {
          throw new RuntimeException("TaskType has Exits. TaskType=" + taskType);
        }
        TASK_HANDLERS_MAP.put(taskHandler.taskType(), (AbstractTaskHandler) taskBeanMap.get(beanName));
        LOGGER.info("Task Handler Register. taskType={},beanName={}", taskHandler.taskType(), beanName);
      }
    });
  }

  public static AbstractTaskHandler getTaskHandler(String taskType) {
    return TASK_HANDLERS_MAP.get(taskType);
  }
}

這里繼承了Spring的ApplicationObjectSupport類,具體的注冊(cè)過程如下

  1. Spring完成bean的初始化
  2. 查找spring的容器中,所有帶有TaskHandler注解的bean
  3. 校驗(yàn)bean是否為AbstractTaskHandler類型,獲取到taskType
  4. 把該bean放到TASK_HANDLERS_MAP容器中,即注冊(cè)完成

任務(wù)執(zhí)行

接下來我們來看下任務(wù)執(zhí)行

public class TaskExecutor implements Job {

  private static final String TASK_TYPE = "taskType";

  @Override
  public BaseResult execute(Task task){
    String taskType=task.getTaskType();
    if (TaskHandlerRegister.getTaskHandler(taskType) == null) {
      throw new RuntimeException("can't find taskHandler,taskType=" + taskType);
    }
    AbstractTaskHandler abstractHandler = TaskHandlerRegister.getTaskHandler(taskType);
    return abstractHandler.execute(task);
  }
}

這里發(fā)起任務(wù)執(zhí)行的是一個(gè)Job,具體過程如下

  1. 校驗(yàn)該任務(wù)類型,有沒有在注冊(cè)中心注冊(cè)相關(guān)Handler
  2. 從任務(wù)注冊(cè)中心獲取到對(duì)應(yīng)的處理的Handelr
  3. 執(zhí)行該Handelr

以上過程就完成了,可以實(shí)現(xiàn)基于注解的一個(gè)任務(wù)路由過程。其實(shí)現(xiàn)思路來自于Spring mvc的RequestMapping的設(shè)計(jì)思路.希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot項(xiàng)目部署到寶塔的詳細(xì)圖文教程

    springboot項(xiàng)目部署到寶塔的詳細(xì)圖文教程

    網(wǎng)上關(guān)于寶塔運(yùn)行springBoot的東西說有點(diǎn)迷糊,但是有一句話很重要,Spring boot項(xiàng)目只需要JDK環(huán)境即可部署成功,下面這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目部署到寶塔的詳細(xì)圖文教程,需要的朋友可以參考下
    2023-05-05
  • MyEclipse開發(fā)一個(gè)webservice接口

    MyEclipse開發(fā)一個(gè)webservice接口

    這篇文章主要為大家詳細(xì)介紹了MyEclipse開發(fā)一個(gè)webservice接口,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • SpringCloud中使用webclient(get和post)請(qǐng)求微服務(wù)接口數(shù)據(jù)

    SpringCloud中使用webclient(get和post)請(qǐng)求微服務(wù)接口數(shù)據(jù)

    在SpringCloud項(xiàng)目中使用WebClient調(diào)用微服務(wù)時(shí),涉及配置WebClient、發(fā)起get和post請(qǐng)求等操作,如請(qǐng)求頭設(shè)置、服務(wù)地址配置、數(shù)據(jù)轉(zhuǎn)換處理、異常處理等,避免在循環(huán)中使用WebClient請(qǐng)求、路徑設(shè)置細(xì)節(jié)以及數(shù)據(jù)返回處理技巧,本文旨在幫助理解和應(yīng)用WebClient進(jìn)行微服務(wù)調(diào)用
    2024-10-10
  • Spring Security注冊(cè)過濾器注意事項(xiàng)詳解

    Spring Security注冊(cè)過濾器注意事項(xiàng)詳解

    前兩天和小伙伴聊了 Spring Security+JWT 實(shí)現(xiàn)無狀態(tài)登錄,然后有小伙伴反饋了一個(gè)問題,感覺這是一個(gè)我們平時(shí)寫代碼容易忽略的問題,所以本文給大家介紹了Spring Security注冊(cè)過濾器注意事項(xiàng),需要的朋友可以參考下
    2024-06-06
  • Java 實(shí)現(xiàn)對(duì)稱加密算法

    Java 實(shí)現(xiàn)對(duì)稱加密算法

    這篇文章主要介紹了Java 實(shí)現(xiàn)對(duì)稱加密算法的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-11-11
  • springboot應(yīng)用中使用過濾器的過程詳解

    springboot應(yīng)用中使用過濾器的過程詳解

    過濾器通常用于實(shí)現(xiàn)跨切面的功能,例如身份驗(yàn)證、日志記錄、請(qǐng)求和響應(yīng)的修改、性能監(jiān)控等,這篇文章主要介紹了springboot應(yīng)用中使用過濾器,需要的朋友可以參考下
    2023-06-06
  • idea 打包maven項(xiàng)目忽略test文件的操作

    idea 打包maven項(xiàng)目忽略test文件的操作

    這篇文章主要介紹了idea 打包maven項(xiàng)目忽略test文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 解決J2EE-session在瀏覽器關(guān)閉后失效問題

    解決J2EE-session在瀏覽器關(guān)閉后失效問題

    最近做項(xiàng)目使用的是Spring+SpringMVC+Mybatis框架,maven管理目錄的javaweb端系統(tǒng),對(duì)于session的一些問題,在此小編給大家分享到腳本之家平臺(tái),需要的朋友參考下吧
    2018-01-01
  • 基于Java protected的深入理解

    基于Java protected的深入理解

    本篇文章是對(duì)Java protected進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 微信開發(fā)之使用java獲取簽名signature

    微信開發(fā)之使用java獲取簽名signature

    這篇文章主要為大家詳細(xì)介紹了微信開發(fā)之使用java獲取簽名signature,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評(píng)論

昌宁县| 百色市| 辽阳县| 梁平县| 临夏县| 凯里市| 河池市| 嵊州市| 会昌县| 东平县| 陵川县| 普格县| 于都县| 宣武区| 神农架林区| 延吉市| 霍林郭勒市| 贡山| 洪江市| 土默特左旗| 贵南县| 泰宁县| 湟源县| 卢湾区| 阿合奇县| 射洪县| 长治市| 扶沟县| 大姚县| 巢湖市| 上思县| 屏东市| 东宁县| 广昌县| 华池县| 汉沽区| 仙居县| 洛扎县| 四平市| 胶南市| 湘潭县|