成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

XXL-JOB GLUE任務(wù)第三方依賴包的管理實踐

開發(fā) 前端
基于方法開發(fā)的任務(wù),底層會生成JobHandler代理,和基于類的方式一樣,任務(wù)也會以JobHandler的形式存在于執(zhí)行器任務(wù)容器中。

背景

xxl-job 是一個分布式任務(wù)調(diào)度平臺,它的應(yīng)用場景非常廣泛,例如定時任務(wù)、消息推送、批處理等。xxl-job 中的任務(wù)類型主要有兩種:

BEAN模式(方法形式)

支持基于方法的開發(fā)方式,每個任務(wù)對應(yīng)一個方法。

  • 優(yōu)點:每個任務(wù)只需要開發(fā)一個方法,并添加”@XxlJob”注解即可,更加方便、快速。支持自動掃描任務(wù)并注入到執(zhí)行器容器。
  • 缺點:要求Spring容器環(huán)境;

基于方法開發(fā)的任務(wù),底層會生成JobHandler代理,和基于類的方式一樣,任務(wù)也會以JobHandler的形式存在于執(zhí)行器任務(wù)容器中。

GLUE模式(源碼方式

任務(wù)以源碼方式維護在調(diào)度中心,支持通過Web IDE在線更新,實時編譯和生效,因此不需要指定JobHandler。例如我的代碼是python類型的代碼,點擊該任務(wù)右側(cè)“GLUE”按鈕,將會前往GLUE任務(wù)的Web IDE界面,在該界面支持對任務(wù)代碼進行開發(fā)。

GLUE Python任務(wù)代碼編輯


  • 優(yōu)點:這種方式相比 BEAN 模式更加靈活,因為任務(wù)邏輯不一定要用 Java 實現(xiàn)。
  • 缺點:存在一定的安全風(fēng)險,因為執(zhí)行器可以執(zhí)行任意的腳本文件

但是大家注意到?jīng)]有,這個地方?jīng)]有涉及應(yīng)用的環(huán)境問題,比如我的是java代碼,那我的程序中的某個包是否在本地能被引用到,即通過maven或是gradle已經(jīng)下載本地了,或是我的python代碼的依賴包是否在當前環(huán)境pip install了,我們從官方的github issues中,看到有很多同學(xué)提到了這些問題.但是這個官方?jīng)]有給出具體的解決方案。這篇文檔,就給大家談?wù)勥@個問題。

https://github.com/xuxueli/xxl-job/issues/129

https://github.com/xuxueli/xxl-job/issues/254

https://github.com/xuxueli/xxl-job/issues/1401

GLUE模式(Java)任務(wù)依賴環(huán)境構(gòu)建

在 xxl-job 的 GLUE 模式下,如果任務(wù)類型為 Java 類型,那么需要保證任務(wù)依賴的相關(guān) JAR 包已經(jīng)下載到本地環(huán)境中,否則任務(wù)執(zhí)行會出現(xiàn) ClassNotFoundException 等類加載異常。

一種比較簡單的方式是將任務(wù)依賴的 JAR 包打成一個 Fat Jar,然后將 Fat Jar 放在執(zhí)行器的 classpath 中即可。Fat Jar 是將多個 JAR 包合并成一個 JAR 包的方式,執(zhí)行時只需要引入這個 JAR 包即可。例如我們修改執(zhí)行器的pom.xml,加入fastjson(相當于把jar放到了執(zhí)行器的classpath中),然后我們的DemoGlueJobHandler便可以引用fastjson里面的類了。

<!-- 阿里JSON解析器 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.68</version>
</dependency>

demo glue直接引用相關(guān)類

demo glue執(zhí)行結(jié)果

除了把依賴包提前放到執(zhí)行器的classpath之外(可能會有包的沖突),還可以在任務(wù)執(zhí)行前,通過代碼動態(tài)加載依賴的 JAR 包,避免手動打包依賴的麻煩。可以使用 URLClassLoader 類實現(xiàn)動態(tài)加載。首先我們把依賴的包放在一個共享盤上,保證執(zhí)行器可以直接訪問到,然后通過反射機制實現(xiàn)代碼的調(diào)用與執(zhí)行。具體實現(xiàn)方式可以參考以下代碼示例:

package com.xxl.job.service.handler;

import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.IJobHandler;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

public class DemoGlueJobHandler extends IJobHandler {


    // 定義一個用于加載外部 JAR 包的 ClassLoader
    public class MyClassLoader extends URLClassLoader {
        public MyClassLoader(URL[] urls) {
            super(urls);
        }
    }

    // 加載外部 JAR 包的方法
    public void loadJars(String[] jarPaths) {
        URL[] urls = new URL[jarPaths.length];
        for (int i = 0; i < jarPaths.length; i++) {
            try {
                urls[i] = new URL("file:" + jarPaths[i]);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
        MyClassLoader myClassLoader = new MyClassLoader(urls);
        Thread.currentThread().setContextClassLoader(myClassLoader);
    }

    @Override
    public void execute() throws Exception {
        // 加載外部 JAR 包
        loadJars(new String[] {"/Users/dongluyang1/.m2/repository/com/alibaba/fastjson/1.2.28/fastjson-1.2.28.jar"});
        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
        Class<?> jsonObjectClass = contextClassLoader.loadClass("com.alibaba.fastjson.JSONObject");
        Method put = jsonObjectClass.getMethod("put", String.class,Object.class);
        Object object =  jsonObjectClass.newInstance();
        put.invoke(object, "keyTest","valueTest");
        Method toJSONString = jsonObjectClass.getMethod("toJSONString");
        // 執(zhí)行任務(wù)邏輯
        XxlJobHelper.log("XXL-JOB, Hello World."+toJSONString.invoke(object));
    }

}

demo glue反射運行結(jié)果

GLUE模式(Python)任務(wù)依賴環(huán)境構(gòu)建

在 xxl-job 的 GLUE 模式下,如果任務(wù)類型為 Python 類型,那么需要保證任務(wù)依賴的相關(guān)庫已經(jīng)下載到本地環(huán)境中,否則任務(wù)執(zhí)行會出現(xiàn) ImportError 等異常。

一種常用的方式是使用 Python 虛擬環(huán)境(Virtual Environment)來管理依賴庫。虛擬環(huán)境是 Python 的一個功能,可以在一個獨立的環(huán)境中安裝 Python 和相關(guān)庫,不會影響到全局環(huán)境。

  1. 首先生成python代碼文件,存儲到公共目錄,比如NFS某個目錄下面
  2. 創(chuàng)建一個腳本文件,同時在任務(wù)的腳本中創(chuàng)建虛擬環(huán)境,安裝所需的依賴庫。可以使用以下命令:
# 創(chuàng)建虛擬環(huán)境
python3 -m venv /path/to/virtualenv
# 激活虛擬環(huán)境
source /path/to/virtualenv/bin/activate
# 安裝依賴庫
pip3 install package1 package2 ...

# 執(zhí)行任務(wù)邏輯
...
# 退出虛擬環(huán)境
deactivate

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2024-04-03 12:57:29

2015-11-05 16:44:37

第三方登陸android源碼

2024-02-20 14:48:40

2024-09-09 08:11:12

2024-01-30 16:51:15

風(fēng)險管理第三方風(fēng)險緩解風(fēng)險

2017-07-10 16:01:04

SDK沖突第三方

2017-11-01 06:40:33

2018-09-30 15:18:29

2011-10-08 14:37:59

漏洞

2022-09-23 13:57:11

xxl-job任務(wù)調(diào)度中間件

2017-12-11 15:53:56

2019-07-30 11:35:54

AndroidRetrofit

2014-07-23 08:55:42

iOSFMDB

2023-06-20 11:34:48

2014-08-13 10:27:23

CocoaPods

2024-08-27 09:34:24

2020-07-17 09:33:39

CPU內(nèi)存調(diào)度

2022-03-26 17:13:22

ElasticJobxxl-job分布式

2023-01-04 09:23:58

2014-07-25 09:33:22

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩不卡一区二区三区 | 一区二区在线不卡 | 中文字幕在线一区二区三区 | 综合久久色 | 天天干狠狠操 | www日| 国产精品日韩一区二区 | 婷婷开心激情综合五月天 | 欧美日韩一区二区视频在线观看 | 天天操天天操 | 综合网视频 | 美人の美乳で授乳プレイ | 久久国产精品视频 | 精品国产久 | 日本xx视频免费观看 | 黄色大片网 | www.国产日本 | 精品久久久久久久久久 | 久久久久久亚洲国产精品 | 亚洲精品1区 | 久久com | 成人在线免费视频观看 | 国产精品永久久久久 | 欧美日一区二区 | 中文字幕在线不卡 | 国产99久久久久 | 亚洲精品在线视频 | 亚洲毛片网站 | 性一交一乱一伦视频免费观看 | 日韩视频一区二区三区 | 国内自拍偷拍 | 欧美在线视频一区二区 | 欧美日韩精品中文字幕 | 免费毛片网站 | 国产亚洲精品精品国产亚洲综合 | 欧美日韩一区精品 | 一级欧美一级日韩片 | 9色视频在线 | 一二三四在线视频观看社区 | 亚洲精品一区二区二区 | 国产精品永久免费视频 |