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

PowerJob的DesignateServer工作流程源碼解讀

 更新時間:2024年01月18日 10:33:54   作者:codecraft  
這篇文章主要介紹了PowerJob的DesignateServer工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

本文主要研究一下PowerJob的DesignateServer

DesignateServer

tech/powerjob/server/remote/server/redirector/DesignateServer.java

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DesignateServer {

    /**
     * 轉(zhuǎn)發(fā)請求需要 AppInfo 下的 currentServer 信息,因此必須要有 appId 作為入?yún)?,該字段指定?appId 字段的參數(shù)名稱,默認為 appId
     * @return appId 參數(shù)名稱
     */
    String appIdParameterName() default "appId";
}
DesignateServer注解定義了appIdParameterName屬性,默認是appId

DesignateServerAspect

tech/powerjob/server/remote/server/redirector/DesignateServerAspect.java

@Slf4j
@Aspect
@Component
@Order(0)
@RequiredArgsConstructor
public class DesignateServerAspect {
    private final TransportService transportService;
    private final AppInfoRepository appInfoRepository;
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    @Around(value = "@annotation(designateServer))")
    public Object execute(ProceedingJoinPoint point, DesignateServer designateServer) throws Throwable {
        // 參數(shù)
        Object[] args = point.getArgs();
        // 方法名
        String methodName = point.getSignature().getName();
        // 類名
        String className = point.getSignature().getDeclaringTypeName();
        Signature signature = point.getSignature();
        // 方法簽名
        MethodSignature methodSignature = (MethodSignature) signature;
        String[] parameterNames = methodSignature.getParameterNames();
        String[] parameterTypes = Arrays.stream(methodSignature.getParameterTypes()).map(Class::getName).toArray(String[]::new);
        Long appId = null;
        for (int i = 0; i < parameterNames.length; i++) {
            if (StringUtils.equals(parameterNames[i], designateServer.appIdParameterName())) {
                appId = Long.parseLong(String.valueOf(args[i]));
                break;
            }
        }
        if (appId == null) {
            throw new PowerJobException("can't find appId in params for:" + signature);
        }
        // 獲取執(zhí)行機器
        AppInfoDO appInfo = appInfoRepository.findById(appId).orElseThrow(() -> new PowerJobException("can't find app info"));
        String targetServer = appInfo.getCurrentServer();
        // 目標IP為空,本地執(zhí)行
        if (StringUtils.isEmpty(targetServer)) {
            return point.proceed();
        }
        // 目標IP與本地符合則本地執(zhí)行
        if (Objects.equals(targetServer, transportService.defaultProtocol().getAddress())) {
            return point.proceed();
        }
        log.info("[DesignateServerAspect] the method[{}] should execute in server[{}], so this request will be redirect to remote server!", signature.toShortString(), targetServer);
        // 轉(zhuǎn)發(fā)請求,遠程執(zhí)行后返回結(jié)果
        RemoteProcessReq remoteProcessReq = new RemoteProcessReq()
                .setClassName(className)
                .setMethodName(methodName)
                .setParameterTypes(parameterTypes)
                .setArgs(args);
        final URL friendUrl = ServerURLFactory.process2Friend(targetServer);
        CompletionStage<AskResponse> askCS = transportService.ask(Protocol.HTTP.name(), friendUrl, remoteProcessReq, AskResponse.class);
        AskResponse askResponse = askCS.toCompletableFuture().get(RemoteConstant.DEFAULT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
        if (!askResponse.isSuccess()) {
            throw new PowerJobException("remote process failed: " + askResponse.getMessage());
        }
        // 考慮范型情況
        Method method = methodSignature.getMethod();
        JavaType returnType = getMethodReturnJavaType(method);
        return OBJECT_MAPPER.readValue(askResponse.getData(), returnType);
    }
    //......
}
DesignateServerAspect攔截了@DesignateServer注解,它先解析方法參數(shù)名,取出參數(shù)名與@DesignateServer的appIdParameterName一致的參數(shù)值,再通過appInfoRepository.findById找到AppInfoDO,獲取appInfo.getCurrentServer();若currentServer就是本機則執(zhí)行point.proceed(),否則構(gòu)建RemoteProcessReq,通過transportService.ask轉(zhuǎn)發(fā)請求

示例

tech/powerjob/server/core/instance/InstanceLogService.java

/**
     * 獲取日志的下載鏈接
     * @param appId AOP 專用
     * @param instanceId 任務實例 ID
     * @return 下載鏈接
     */
    @DesignateServer
    public String fetchDownloadUrl(Long appId, Long instanceId) {
        String url = "http://" + NetUtils.getLocalHost() + ":" + port + "/instance/downloadLog?instanceId=" + instanceId;
        log.info("[InstanceLog-{}] downloadURL for appId[{}]: {}", instanceId, appId, url);
        return url;
    }
fetchDownloadUrl指定了@DesignateServer注解,會根據(jù)appId的值限定在指定server執(zhí)行

小結(jié)

PowerJob的DesignateServer注解定義了appIdParameterName屬性,默認是appId;DesignateServerAspect攔截了@DesignateServer注解,它判斷currentServer就是本機則執(zhí)行point.proceed(),否則構(gòu)建RemoteProcessReq,通過transportService.ask轉(zhuǎn)發(fā)請求到指定server執(zhí)行。

以上就是PowerJob的DesignateServer工作流程源碼解讀的詳細內(nèi)容,更多關(guān)于PowerJob DesignateServer的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中的延遲隊列DelayQueue詳細解析

    Java中的延遲隊列DelayQueue詳細解析

    這篇文章主要介紹了Java中的延遲隊列DelayQueue詳細解析,JDK自身支持延遲隊列的數(shù)據(jù)結(jié)構(gòu),其實類:java.util.concurrent.DelayQueue,<BR>我們通過閱讀源碼的方式理解該延遲隊列類的實現(xiàn)過程,需要的朋友可以參考下
    2023-12-12
  • Java利用隨機分錢模擬財富變化

    Java利用隨機分錢模擬財富變化

    這篇文章主要為大家詳細介紹了Java如何利用隨機分錢思想模擬財富的變化,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-12-12
  • Spring Boot事務配置詳解

    Spring Boot事務配置詳解

    這篇文章主要介紹了Spring Boot事務配置詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Spring Security驗證流程剖析及自定義驗證方法

    Spring Security驗證流程剖析及自定義驗證方法

    Spring Security是一個能夠為基于Spring的企業(yè)應用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架。這篇文章主要介紹了Spring Security驗證流程剖析及自定義驗證方法,需要的朋友可以參考下
    2018-03-03
  • String類型傳遞是值傳遞,char[]類型傳遞是引用傳遞的實現(xiàn)

    String類型傳遞是值傳遞,char[]類型傳遞是引用傳遞的實現(xiàn)

    下面小編就為大家?guī)硪黄猄tring類型傳遞是值傳遞,char[]類型傳遞是引用傳遞的實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看不
    2016-09-09
  • SpringBoot中實現(xiàn)GraphQL訂閱的示例代碼

    SpringBoot中實現(xiàn)GraphQL訂閱的示例代碼

    本文主要介紹了SpringBoot中實現(xiàn)GraphQL訂閱的示例代碼,GraphQL訂閱能夠?qū)崿F(xiàn)實時數(shù)據(jù)推送,為開發(fā)者提供了一種高效、靈活的API設(shè)計和數(shù)據(jù)交互方式
    2026-02-02
  • Java方法重載實現(xiàn)原理及代碼實例

    Java方法重載實現(xiàn)原理及代碼實例

    這篇文章主要介紹了Java方法重載實現(xiàn)原理及代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • JCrontab簡單入門實例詳解

    JCrontab簡單入門實例詳解

    這篇文章主要為大家詳細介紹了JCrontab簡單入門實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 利用feign調(diào)用返回object類型轉(zhuǎn)換成實體

    利用feign調(diào)用返回object類型轉(zhuǎn)換成實體

    這篇文章主要介紹了利用feign調(diào)用返回object類型轉(zhuǎn)換成實體,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java文件操作與IO流詳解(File類+字節(jié)流+字符流)

    Java文件操作與IO流詳解(File類+字節(jié)流+字符流)

    文章主要介紹了文件、路徑和文件類型(文本文件和二進制文件)的概念,并詳細介紹了Java中File類和FileInputStream、FileOutputStream、FileReader、FileWriter等幾個流類的操作方式,需要的朋友可以參考下
    2026-04-04

最新評論

安陆市| 嘉黎县| 湘潭市| 蓝田县| 平乐县| 富川| 常熟市| 乐平市| 南安市| 田东县| 浏阳市| 大丰市| 海宁市| 伽师县| 晴隆县| 金堂县| 格尔木市| 贵定县| 楚雄市| 成安县| 丰顺县| 黑山县| 台南县| 邹城市| 稻城县| 乐业县| 崇义县| 哈尔滨市| 长治县| 沈丘县| 宜州市| 即墨市| 梅河口市| 河北省| 大兴区| 贡山| 洪雅县| 织金县| 开江县| 长岭县| 阳山县|