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

PowerJob的ProcessorLoader工作流程源碼解讀

 更新時間:2023年12月22日 09:28:34   作者:codecraft  
這篇文章主要為大家介紹了PowerJob的ProcessorLoader工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

本文主要研究一下PowerJob的ProcessorLoader

ProcessorLoader

tech/powerjob/worker/processor/ProcessorLoader.java

public interface ProcessorLoader {
    ProcessorBean load(ProcessorDefinition definition);
}
ProcessorLoader定義了load方法,用于根據ProcessorDefinition加載ProcessorBean

ProcessorDefinition

tech/powerjob/worker/extension/processor/ProcessorDefinition.java

@Getter
@Setter
@ToString
@Accessors(chain = true)
public class ProcessorDefinition implements Serializable {
    /**
     * 后臺配置的處理器類型
     */
    private String processorType;
    /**
     * 后臺配置的處理器信息
     */
    private String processorInfo;
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        ProcessorDefinition that = (ProcessorDefinition) o;
        return Objects.equals(processorType, that.processorType) && Objects.equals(processorInfo, that.processorInfo);
    }
    @Override
    public int hashCode() {
        return Objects.hash(processorType, processorInfo);
    }
}
ProcessorDefinition定義了processorType及processorInfo兩個屬性

ProcessorBean

tech/powerjob/worker/extension/processor/ProcessorBean.java

@Getter
@Setter
@Accessors(chain = true)
public class ProcessorBean {
    /**
     * 真正用來執(zhí)行邏輯的處理器對象
     */
    private transient BasicProcessor processor;
    /**
     * 加載該處理器對象的 classLoader,可空,空則使用 {@link Object#getClass()#getClassLoader() 代替}
     */
    private transient ClassLoader classLoader;
}
ProcessorBean定義了BasicProcessor及ClassLoader兩個屬性

PowerJobProcessorLoader

tech/powerjob/worker/processor/PowerJobProcessorLoader.java

@Slf4j
public class PowerJobProcessorLoader implements ProcessorLoader {
    private final List<ProcessorFactory> processorFactoryList;
    private final Map<ProcessorDefinition, ProcessorBean> def2Bean = new ConcurrentHashMap<>(128);
    public PowerJobProcessorLoader(List<ProcessorFactory> processorFactoryList) {
        this.processorFactoryList = processorFactoryList;
    }
    @Override
    public ProcessorBean load(ProcessorDefinition definition) {
        return def2Bean.computeIfAbsent(definition, ignore -> {
            final String processorType = definition.getProcessorType();
            log.info("[ProcessorFactory] start to load Processor: {}", definition);
            for (ProcessorFactory pf : processorFactoryList) {
                final String pfName = pf.getClass().getSimpleName();
                if (!Optional.ofNullable(pf.supportTypes()).orElse(Collections.emptySet()).contains(processorType)) {
                    log.info("[ProcessorFactory] [{}] can't load type={}, skip!", pfName, processorType);
                    continue;
                }
                log.info("[ProcessorFactory] [{}] try to load processor: {}", pfName, definition);
                try {
                    ProcessorBean processorBean = pf.build(definition);
                    if (processorBean != null) {
                        log.info("[ProcessorFactory] [{}] load processor successfully: {}", pfName, definition);
                        return processorBean;
                    }
                } catch (Throwable t) {
                    log.error("[ProcessorFactory] [{}] load processor failed: {}", pfName, definition, t);
                }
            }
            throw new PowerJobException("fetch Processor failed, please check your processorType and processorInfo config");
        });
    }
}
PowerJobProcessorLoader實現了ProcessorLoader接口,其構造器要求傳入processorFactoryList,它還定義了def2Bean,用于維護ProcessorDefinition與ProcessorBean的關系;其load方法使用ConcurrentHashMap的computeIfAbsent,將加載好的ProcessorBean放入到def2Bean;其加載過程為遍歷processorFactoryList,找到支持該processorType的ProcessorFactory,然后執(zhí)行其build方法進行構造

ProcessorFactory

tech/powerjob/worker/extension/processor/ProcessorFactory.java

public interface ProcessorFactory {
    /**
     * 支持的處理器類型,類型不匹配則跳過該 ProcessorFactory 的加載邏輯
     * 對應的是控制臺的'處理器類型' TAB,不做任何定制的情況下,取值范圍為 {@link ProcessorType#name()}
     * @return 支持的處理器類型
     */
    Set<String> supportTypes();
    /**
     * 根據處理器定義構建處理器對象
     * 注意:Processor 為單例對象,即 PowerJob 對每一個 ProcessorBean 只調用一次 build 方法
     * @param processorDefinition 處理器定義
     * @return null or ProcessorBean
     */
    ProcessorBean build(ProcessorDefinition processorDefinition);
}
ProcessorFactory接口定義了supportTypes、build方法;它有四個實現類,其中BuiltInSpringProcessorFactory及BuildInSpringMethodProcessorFactory繼承自AbstractBuildInSpringProcessorFactory,另外兩個為BuiltInDefaultProcessorFactory、JarContainerProcessorFactory

BuiltInDefaultProcessorFactory

tech/powerjob/worker/processor/impl/BuiltInDefaultProcessorFactory.java

@Slf4j
public class BuiltInDefaultProcessorFactory implements ProcessorFactory {
    @Override
    public Set<String> supportTypes() {
        return Sets.newHashSet(ProcessorType.BUILT_IN.name());
    }
    @Override
    public ProcessorBean build(ProcessorDefinition processorDefinition) {
        String className = processorDefinition.getProcessorInfo();
        try {
            Class<?> clz = Class.forName(className);
            BasicProcessor basicProcessor = (BasicProcessor) clz.getDeclaredConstructor().newInstance();
            return new ProcessorBean()
                    .setProcessor(basicProcessor)
                    .setClassLoader(basicProcessor.getClass().getClassLoader());
        }catch (Exception e) {
            log.warn("[ProcessorFactory] load local Processor(className = {}) failed.", className, e);
        }
        return null;
    }
}
BuiltInDefaultProcessorFactory是默認的處理器工廠,通過全限定類名加載處理器,但沒有IOC功能

JarContainerProcessorFactory

tech/powerjob/worker/processor/impl/JarContainerProcessorFactory.java

@Slf4j
public class JarContainerProcessorFactory implements ProcessorFactory {
    private final WorkerRuntime workerRuntime;
    public JarContainerProcessorFactory(WorkerRuntime workerRuntime) {
        this.workerRuntime = workerRuntime;
    }
    @Override
    public Set<String> supportTypes() {
        return Sets.newHashSet(ProcessorType.EXTERNAL.name());
    }
    @Override
    public ProcessorBean build(ProcessorDefinition processorDefinition) {
        String processorInfo = processorDefinition.getProcessorInfo();
        String[] split = processorInfo.split("#");
        String containerName = split[0];
        String className = split[1];
        log.info("[ProcessorFactory] try to load processor({}) in container({})", className, containerName);
        OmsContainer omsContainer = OmsContainerFactory.fetchContainer(Long.valueOf(containerName), workerRuntime);
        if (omsContainer != null) {
            return new ProcessorBean()
                    .setProcessor(omsContainer.getProcessor(className))
                    .setClassLoader(omsContainer.getContainerClassLoader());
        } else {
            log.warn("[ProcessorFactory] load container failed. processor info : {}", processorInfo);
        }
        return null;
    }
}
JarContainerProcessorFactory主要是通過OmsContainer來加載ProcessorBean

AbstractBuildInSpringProcessorFactory

tech/powerjob/worker/processor/impl/AbstractBuildInSpringProcessorFactory.java

@Slf4j
public abstract class AbstractBuildInSpringProcessorFactory implements ProcessorFactory {
    protected final ApplicationContext applicationContext;
    protected AbstractBuildInSpringProcessorFactory(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }
    @Override
    public Set<String> supportTypes() {
        return Sets.newHashSet(ProcessorType.BUILT_IN.name());
    }
    protected boolean checkCanLoad() {
        try {
            ApplicationContext.class.getClassLoader();
            return applicationContext != null;
        } catch (Throwable ignore) {
        }
        return false;
    }
    @SuppressWarnings("unchecked")
    protected static <T> T getBean(String className, ApplicationContext ctx) throws Exception {
        // 0. 嘗試直接用 Bean 名稱加載
        try {
            final Object bean = ctx.getBean(className);
            if (bean != null) {
                return (T) bean;
            }
        } catch (Exception ignore) {
        }
        // 1. ClassLoader 存在,則直接使用 clz 加載
        ClassLoader classLoader = ctx.getClassLoader();
        if (classLoader != null) {
            return (T) ctx.getBean(classLoader.loadClass(className));
        }
        // 2. ClassLoader 不存在(系統(tǒng)類加載器不可見),嘗試用類名稱小寫加載
        String[] split = className.split("\\.");
        String beanName = split[split.length - 1];
        // 小寫轉大寫
        char[] cs = beanName.toCharArray();
        cs[0] += 32;
        String beanName0 = String.valueOf(cs);
        log.warn("[SpringUtils] can't get ClassLoader from context[{}], try to load by beanName:{}", ctx, beanName0);
        return (T) ctx.getBean(beanName0);
    }
}
AbstractBuildInSpringProcessorFactory是兩個spring相關ProcessorFactory的抽象類,它使用spring的ApplicationContext來加載

BuiltInSpringProcessorFactory

tech/powerjob/worker/processor/impl/BuiltInSpringProcessorFactory.java

@Slf4j
public class BuiltInSpringProcessorFactory extends AbstractBuildInSpringProcessorFactory {
    public BuiltInSpringProcessorFactory(ApplicationContext applicationContext) {
        super(applicationContext);
    }
    @Override
    public ProcessorBean build(ProcessorDefinition processorDefinition) {
        try {
            boolean canLoad = checkCanLoad();
            if (!canLoad) {
                log.info("[ProcessorFactory] can't find Spring env, this processor can't load by 'BuiltInSpringProcessorFactory'");
                return null;
            }
            String processorInfo = processorDefinition.getProcessorInfo();
            //用于區(qū)分方法級別的參數
            if (processorInfo.contains("#")) {
                return null;
            }
            BasicProcessor basicProcessor = getBean(processorInfo, applicationContext);
            return new ProcessorBean()
                    .setProcessor(basicProcessor)
                    .setClassLoader(basicProcessor.getClass().getClassLoader());
        } catch (NoSuchBeanDefinitionException ignore) {
            log.warn("[ProcessorFactory] can't find the processor in SPRING");
        } catch (Throwable t) {
            log.warn("[ProcessorFactory] load by BuiltInSpringProcessorFactory failed. If you are using Spring, make sure this bean was managed by Spring", t);
        }
        return null;
    }
}
BuiltInSpringProcessorFactory通過ApplicationContext加載spring相關的Bean,但它不處理processorInfo包含#的processorDefinition

BuildInSpringMethodProcessorFactory

tech/powerjob/worker/processor/impl/BuildInSpringMethodProcessorFactory.java

@Slf4j
public class BuildInSpringMethodProcessorFactory extends AbstractBuildInSpringProcessorFactory {
    private static final List<String> jobHandlerRepository = new LinkedList<>();
    private final static String DELIMITER = "#";
    public BuildInSpringMethodProcessorFactory(ApplicationContext applicationContext) {
        super(applicationContext);
    }
    @Override
    public ProcessorBean build(ProcessorDefinition processorDefinition) {
        try {
            boolean canLoad = checkCanLoad();
            if (!canLoad) {
                log.info("[ProcessorFactory] can't find Spring env, this processor can't load by 'BuildInSpringMethodProcessorFactory'");
                return null;
            }
            String processorInfo = processorDefinition.getProcessorInfo();
            if (!processorInfo.contains(DELIMITER)) {
                log.info("[ProcessorFactory] can't parse processorDefinition, this processor can't load by 'BuildInSpringMethodProcessorFactory'");
                return null;
            }
            String[] split = processorInfo.split(DELIMITER);
            String methodName = split[1];
            String className = split[0];
            Object bean = getBean(className,applicationContext);
            Method[] methods = bean.getClass().getDeclaredMethods();
            for (Method method : methods) {
                PowerJobHandler powerJob = method.getAnnotation(PowerJobHandler.class);
                if (powerJob == null) {
                    continue;
                }
                String name = powerJob.name();
                //匹配到和頁面定義相同的methodName
                if (!name.equals(methodName)) {
                    continue;
                }
                if (name.trim().length() == 0) {
                    throw new RuntimeException("method-jobhandler name invalid, for[" + bean.getClass() + "#" + method.getName() + "] .");
                }
                if (containsJobHandler(name)) {
                    throw new RuntimeException("jobhandler[" + name + "] naming conflicts.");
                }
                method.setAccessible(true);
                registerJobHandler(methodName);
                MethodBasicProcessor processor = new MethodBasicProcessor(bean, method);
                return new ProcessorBean()
                        .setProcessor(processor)
                        .setClassLoader(processor.getClass().getClassLoader());
            }
        } catch (NoSuchBeanDefinitionException ignore) {
            log.warn("[ProcessorFactory] can't find the processor in SPRING");
        } catch (Throwable t) {
            log.warn("[ProcessorFactory] load by BuiltInSpringProcessorFactory failed. If you are using Spring, make sure this bean was managed by Spring", t);
        }
        return null;
    }
    public static void registerJobHandler(String name) {
        jobHandlerRepository.add(name);
    }
    private boolean containsJobHandler(String name) {
        return jobHandlerRepository.contains(name);
    }
}
BuildInSpringMethodProcessorFactory專門用于processorInfo包含#的processorDefinition,它會遍歷指定class的methods,找到方法上標注有@PowerJobHandler注解且方法名一致的method,注冊到jobHandlerRepository,其創(chuàng)建的是MethodBasicProcessor

小結

PowerJob的ProcessorLoader定義了load方法,用于根據ProcessorDefinition加載ProcessorBean;PowerJobProcessorLoader實現了ProcessorLoader接口,它會遍歷processorFactoryList,找到支持該processorType的ProcessorFactory,然后執(zhí)行其build方法進行構造;ProcessorFactory接口定義了supportTypes、build方法;它有四個實現類,其中BuiltInSpringProcessorFactory及BuildInSpringMethodProcessorFactory繼承自AbstractBuildInSpringProcessorFactory,另外兩個為BuiltInDefaultProcessorFactory、JarContainerProcessorFactory。

以上就是PowerJob的ProcessorLoader的詳細內容,更多關于PowerJob ProcessorLoader的資料請關注腳本之家其它相關文章!

相關文章

  • Java事務@Transactional?、@GlobalTransactional使用步驟

    Java事務@Transactional?、@GlobalTransactional使用步驟

    這篇文章主要介紹了使用@Transactional和@GlobalTransactional注解進行事務管理的區(qū)別和應用場景,@Transactional用于單個服務內的本地事務管理,而@GlobalTransactional用于跨服務的分布式事務管理,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2025-05-05
  • 重新認識Java中的ThreadLocal

    重新認識Java中的ThreadLocal

    ThreadLocal是JDK包提供的,它提供線程本地變量,如果創(chuàng)建一個ThreadLocal變量,那么訪問這個變量的每個線程都會有這個變量的一個副本,在實際多線程操作的時候,操作的是自己本地內存中的變量,從而規(guī)避了線程安全問題
    2021-05-05
  • JavaSE中Lambda表達式的使用與變量捕獲

    JavaSE中Lambda表達式的使用與變量捕獲

    這篇文章主要介紹了JavaSE中Lambda表達式的使用與變量捕獲,Lambda表達式允許你通過表達式來代替功能接口, 就和方法一樣,它提供了一個正常的參數列表和一個使用這些參數的主體,下面我們來詳細看看,需要的朋友可以參考下
    2023-10-10
  • 詳解Spring?MVC優(yōu)雅處理異常的6種方式

    詳解Spring?MVC優(yōu)雅處理異常的6種方式

    在Spring中提供了多種機制來處理控制器拋出的異常,確保應用程序在面對各種錯誤情況時能夠優(yōu)雅地響應,本文我們來詳細分析Spring?MVC中6種優(yōu)雅處理異常的方式,需要的可以參考下
    2024-12-12
  • 詳解Java生成PDF文檔方法

    詳解Java生成PDF文檔方法

    這篇文章主要介紹了Java生成PDF文檔方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • springmvc處理模型數據Map過程解析

    springmvc處理模型數據Map過程解析

    這篇文章主要介紹了springmvc處理模型數據Map過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • idea中誤刪*.iml的問題解決辦法

    idea中誤刪*.iml的問題解決辦法

    *.iml是IntelliJ IDEA中的模塊配置文件,當丟失此文件時,項目可能出現錯誤,解決辦法是在項目目錄下執(zhí)行mvn idea:module命令來重新生成,下面就來具體介紹一下
    2025-08-08
  • java使用xpath解析xml示例分享

    java使用xpath解析xml示例分享

    XPath基于XML的樹狀結構,提供在數據結構樹中找尋節(jié)點的能力,下面是一小示例,需要的朋友可以參考下
    2014-03-03
  • Redis6搭建集群并在SpringBoot中使用RedisTemplate的實現

    Redis6搭建集群并在SpringBoot中使用RedisTemplate的實現

    本文主要介紹了Redis6搭建集群并在SpringBoot中使用RedisTemplate,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Java中的ReentrantReadWriteLock使用詳解

    Java中的ReentrantReadWriteLock使用詳解

    這篇文章主要介紹了Java中的ReentrantReadWriteLock使用詳解,ReentrantReadWriteLock是Java中的一個鎖實現,它提供了讀寫分離的功能,這種讀寫分離的機制可以提高并發(fā)性能,特別適用于讀多寫少的場景,需要的朋友可以參考下
    2023-11-11

最新評論

宣武区| 习水县| 吴堡县| 漠河县| 辽阳县| 恭城| 金川县| 北京市| 山西省| 松阳县| 合肥市| 仁寿县| 田林县| 潼南县| 雷山县| 万载县| 资溪县| 民乐县| 永平县| 霞浦县| 渭南市| 南岸区| 双牌县| 清流县| 海丰县| 通辽市| 铜川市| 古丈县| 改则县| 星子县| 文山县| 平泉县| 长垣县| 当阳市| 泸州市| 大关县| 边坝县| 吴川市| 沂南县| 若尔盖县| 大化|