国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

造個輪子-任務調度執(zhí)行小框架-任務清單執(zhí)行器實現(xiàn)

這篇具有很好參考價值的文章主要介紹了造個輪子-任務調度執(zhí)行小框架-任務清單執(zhí)行器實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

okey,上一篇文章我們提到了,如何實現(xiàn)它的一個清單的一個代理。這里的話我們來捋一捋我們的這個執(zhí)行流程是啥:
造個輪子-任務調度執(zhí)行小框架-任務清單執(zhí)行器實現(xiàn),手把手教你編寫任務執(zhí)行框架,開發(fā)語言,java,架構
所以的話,我們的我們這里今天要做的是這個執(zhí)行器的一個執(zhí)行。當然這里的話,我們也是分兩個部分,因為這個執(zhí)行器的話,是分兩個部分的,一個是正常的任務執(zhí)行,還有一個是這個宕機之后,我們對任務的一個恢復的處理。

執(zhí)行器流程

提交流程

那么在這里的話,我得先說說這個執(zhí)行器提交的流程,因為這個不說清楚的話,就比較麻煩了。
首先我們先來看到這幾個類:
造個輪子-任務調度執(zhí)行小框架-任務清單執(zhí)行器實現(xiàn),手把手教你編寫任務執(zhí)行框架,開發(fā)語言,java,架構
然后的話,我們的流程是這樣的:

1. ExecuteMagaer 負責創(chuàng)建TaskWrapper
2. TaskWrapper 里面包含了代理對象,執(zhí)行代理對象的執(zhí)行方法
3.TaskWraaper 提交到線程池里面去

所以的話,是通過這三個環(huán)節(jié),最終任務提交到了我們的這個線程池里面,然后進行執(zhí)行。

線程池實現(xiàn)

okey,這里的話,我們當然需要去有一個線程池,但是這個線程池的話,有個特點,那就是:

  1. 如果你有ID,那么相同ID的任務排隊執(zhí)行
  2. 如果沒有ID,那么就直接異步執(zhí)行
    這樣做的話有啥好處嘛,好處就是,假設這個ID是你的UserID,在用戶下單的時候,就算重復下單,由于兩次賬單是順序執(zhí)行的,第一個賬單執(zhí)行完畢之后,改變了狀態(tài),假設此時你對商品ID上鎖了,那么第二個賬單執(zhí)行的時候,發(fā)現(xiàn)商品ID鎖住了,就不會繼續(xù)無腦執(zhí)行了。主要是實現(xiàn)更加細致的操作。
package com.huterox.todoscheduler.common.impl;


import com.huterox.todoscheduler.common.SerializationUtils;
import com.huterox.todoscheduler.common.TaskManager;
import com.huterox.todoscheduler.config.Configuration;
import com.huterox.todoscheduler.core.wapper.TaskWrapper;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.*;

/**
 * 任務管理器
 * */
public class DefaultTaskManager implements TaskManager, Serializable {

    private final ThreadPoolExecutor executor;
    private final Map<String, BlockingQueue<Runnable>> taskQueues;
    private final Object lock;

    public DefaultTaskManager(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit) {
        executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, new LinkedBlockingQueue<>());
        taskQueues = new HashMap<>();
        lock = new Object();
    }

    public DefaultTaskManager() {

        executor = new ThreadPoolExecutor(
                Configuration.corePoolSize,
                Configuration.maximumPoolSize,
                Configuration.keepAliveTime,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>());
        taskQueues = new HashMap<>();
        lock = new Object();
    }

    @Override
    public void submitTask(TaskWrapper task, String id) {
        if (id == null || id.isEmpty()) {
            executor.execute(task); // 直接執(zhí)行任務
            //然后保存當前的一個狀態(tài)
            saveStatus();
        } else {
            synchronized (lock) {
                BlockingQueue<Runnable> queue = taskQueues.computeIfAbsent(id, k -> new LinkedBlockingQueue<>());

                if (queue.isEmpty()) {
                    // 之前沒有相同ID的任務在執(zhí)行,直接提交到線程池執(zhí)行
                    executor.execute(() -> {
                        try {
                            task.run(); // 執(zhí)行任務
                        } finally {
                            submitNextTask(id); // 執(zhí)行完畢后提交下一個任務
                            saveStatus();
                        }
                    });
                } else {
                    // 將任務加入隊列中,等待前面的任務執(zhí)行完畢后再執(zhí)行
                    queue.offer(() -> {
                        try {
                            task.run(); // 執(zhí)行任務
                        } finally {
                            submitNextTask(id); // 執(zhí)行完畢后提交下一個任務
                            saveStatus();
                        }
                    });
                }
            }
        }
    }

    @Override
    public void saveStatus() {
        //保存當前的一個狀態(tài)
        SerializationUtils.serializeObject(this,"runningTask","task.ser");
    }

    private void submitNextTask(String id) {
        synchronized (lock) {
            BlockingQueue<Runnable> queue = taskQueues.get(id);
            if (queue != null && !queue.isEmpty()) {
                executor.execute(queue.poll()); // 提交下一個任務
            } else {
                taskQueues.remove(id); // 隊列為空時移除對應的ID
            }
        }
    }

    public ThreadPoolExecutor getExecutor() {
        return executor;
    }

    public Map<String, BlockingQueue<Runnable>> getTaskQueues() {
        return taskQueues;
    }

    public Object getLock() {
        return lock;
    }

    @Override
    public void shutdown() {
        executor.shutdown();
    }
}

這里面的代碼細節(jié),我就不說了,因為不難,再說篇幅太大了,還有好多東西要說呢。

執(zhí)行器實現(xiàn)

ok,我們說了這個流程,我們來看到這個執(zhí)行器是如何實現(xiàn)的。

接口

首先的話,我們是有一個接口的:

package com.huterox.todoscheduler.core.execute;

/**
 * 我們核心的調度器,通過TodoListFactory可以得到可以執(zhí)行的任務清單
 * */
public interface ExecuteCore {

    void execute(String ListName);

    String getClsId();

    void run();

    //服務器意外宕機之后,恢復這個任務的時候要進行的操作
    void repair();



}

看到這個接口的話,有好幾個方法,首先是執(zhí)行提交的,然后是run,這個主要是這個原因:

package com.huterox.todoscheduler.core.wapper;

import com.huterox.todoscheduler.core.enumType.ExecuteType;
import com.huterox.todoscheduler.core.execute.ExecuteCore;

import java.io.Serializable;


public class TaskWrapper implements Runnable, Serializable {

    private ExecuteCore executeCore;

    private ExecuteType executeType = ExecuteType.Run;

    public TaskWrapper() {
    }

    public ExecuteCore getExecuteCore() {
        return executeCore;
    }

    public ExecuteType getExecuteType() {
        return executeType;
    }

    public void setExecuteType(ExecuteType executeType) {
        this.executeType = executeType;
    }

    public void setExecuteCore(ExecuteCore executeCore) {
        this.executeCore = executeCore;
    }

    public TaskWrapper(ExecuteCore executeCore) {
        this.executeCore = executeCore;
    }

    @Override
    public void run() {
        if(executeType==ExecuteType.Run){
            executeCore.run();
        }else if(executeType==ExecuteType.Repair){
            executeCore.repair();
        }

    }
}

這個TaskWrapper是實現(xiàn)了Runable接口,里面有run,所以就索性這樣寫了。

狀態(tài)標志

之后的話,我們的項目到這里的話,只是實現(xiàn)了一個正向的過程,就是當項目宕機的時候,我們要盡可能去恢復任務清單的一個執(zhí)行,或者狀態(tài),比如你買東西的接口,后面執(zhí)行退款代碼的時候,服務器宕機了,那么這個時候,我要盡可能去恢復這個宕機退款的執(zhí)行。當然這里面要考慮的東西要多得多,小項目的話,你要相信第三方組件要比自己寫的代碼靠譜(狗頭)

這里主要是這兩個:
造個輪子-任務調度執(zhí)行小框架-任務清單執(zhí)行器實現(xiàn),手把手教你編寫任務執(zhí)行框架,開發(fā)語言,java,架構

package com.huterox.todoscheduler.core.enumType;

import java.io.Serializable;

/**
 * 當前的任務清單執(zhí)行的情況
 * */
public enum TodoListStateType implements Serializable {

    CreatFailed,
    Running,
    Fine,
    Error,
    Repairing;
}

package com.huterox.todoscheduler.core.enumType;

import java.io.Serializable;

public enum TodoItemStateType implements Serializable {

    /**
     * 需要重新運行啟動,適用于強一致的清單
     * */
    Again,

    Running,

    Error,

    /**
     * 運行正常
     * */
    Fine,

    /**
     * 只需要執(zhí)行修復,適用于弱一致的清單
     * */
    Repairing;
}

執(zhí)行周期實現(xiàn)

之后的話,就是我們要實現(xiàn)一個完整的執(zhí)行周期了:

清單代理創(chuàng)建

在執(zhí)行的時候 ,我們先要去創(chuàng)建這個代理對象。但是這個代理對象的話,也有創(chuàng)建前執(zhí)行處理器,之后處理器等待。所以這里也要進行一個處理:

    @Override
    public void execute(String ListName) {
        //1. 先拿到可執(zhí)行清單對象
        todoListExBean = TodoListFactory.getInstance(ListName);
        //2. 查看返回的結果
        if(todoListExBean==null){
            //說明創(chuàng)建就失敗了,這個失敗是清單對象都沒有起來
            this.running = false;
        }else {
            if(todoListExBean.getTodoListStateType()== TodoListStateType.CreatFailed){
                //創(chuàng)建失敗了
                if(todoListExBean.getTodoListElementType()== TodoListElementType.NothingConsistency
                    || todoListExBean.getTodoListElementType()== TodoListElementType.WeakConsistency
                ){
                    //在創(chuàng)建階段,只要你不是強一致性,那么我就不管你,如果創(chuàng)建都失敗了
                    System.err.println("任務清單創(chuàng)建失敗,取消執(zhí)行");
                }else if(todoListExBean.getTodoListElementType()==TodoListElementType.StrongConsistency){
                    //強一致,這個時候,直接進入失敗隊列,這個時候也是創(chuàng)建失敗,但是這個失敗是指
                    //清單項目創(chuàng)建的時候有問題,清單對象起來了
                    TodoListFailedList.addFailedWithSerializable(todoListExBean);
                    this.running = false;
                }
            }
        }
    }

清單項執(zhí)行

之后的 話,才是執(zhí)行我們的 方法。執(zhí)行之后結束。
然后對于一個清單項,它其實有這樣的幾個過程:

  1. 清單項創(chuàng)建前(在Factory的時候就可以看到)
  2. 當前清單項執(zhí)行前
  3. 當前清單項執(zhí)行時刻
  4. 當前清單項執(zhí)行后
  5. 清單項執(zhí)行異常

一個完整的清單周期包括:

  1. 清單創(chuàng)建前(創(chuàng)建之后是立刻執(zhí)行的,因此沒有執(zhí)行前這個方法)
  2. 清單項周期
  3. 清單結束
  4. 清單執(zhí)行異常
 @Override
    public void run() {

        if(!this.running){
            System.err.println("執(zhí)行失敗,停止執(zhí)行該任務清單");
            return;
        }

        todoListExBean.setExTimes(todoListExBean.getExTimes()+1);
        todoListExBean.setTodoListStateType(TodoListStateType.Running);
        //在這里完成方法任務清單項的執(zhí)行
        //同時在這里完成狀態(tài)的持久化處理,方便恢復狀態(tài)
        Map<Integer, TodoItemExBean> sortedMap = todoListExBean.getSortedMap();

        //開始遍歷執(zhí)行清單項
        for(Map.Entry<Integer, TodoItemExBean> entry:sortedMap.entrySet()){
            Integer key = entry.getKey();
            TodoItemExBean entryValue = entry.getValue();
            entryValue.setTodoItemStateType(TodoItemStateType.Running);
            //這里開始按照生命周期執(zhí)行代碼
            try {
                if (entryValue.getTodoItemBeforeRunningHandler()!=null)
                {
                    //執(zhí)行第一個運行時,運行前的代碼
                    TodoItemBeforeRunningHandler todoItemBeforeRunningHandler = entryValue.
                            getTodoItemBeforeRunningHandler();
                    boolean concierge = todoItemBeforeRunningHandler.concierge(
                            entryValue.getStateWrapper(),
                            todoListExBean.getStateWrapper()
                    );
                    if(!concierge){

                        //沒有滿足通過條件,需要跳過或者終止
                        if(entryValue.getTodoItemElementType()== TodoItemElementType.CONTINUTEITEM){
                            System.err.println("任務清單:"+todoListExBean.getTodoListName()
                                    +"-Cid:" + todoListExBean.getClsId()+"第"+entryValue.getOrder()+
                                    "方法:"+entryValue.getWrapperMethod().getName()+"未通過運行時執(zhí)行前Handler"
                                    +"正在前往執(zhí)行下一個任務項"
                                    );
                        }else {
                            //查看當前任務清單類型,如果是那種強一致性的,那就加入失敗隊列,等待重啟
                            if(todoListExBean.getTodoListElementType()==TodoListElementType.StrongConsistency) {
                                //強一致,這個時候,直接進入失敗隊列
                                entryValue.setTodoItemStateType(TodoItemStateType.Again);
                                TodoListFailedList.addFailedWithSerializable(todoListExBean);
                            }else if(
                                todoListExBean.getTodoListElementType()==TodoListElementType.WeakConsistency
                            ){
                                entryValue.setTodoItemStateType(TodoItemStateType.Repairing);
                            }
                            return;
                        }
                        entryValue.setTodoItemStateType(TodoItemStateType.Repairing);
                        //這個時候由于沒有滿足條件,那么這個時候要執(zhí)行對應的恢復函數(shù)
                        todoItemBeforeRunningHandler.repair(
                                entryValue.getStateWrapper(),
                                todoListExBean.getStateWrapper()
                        );
                    }
                }

                //執(zhí)行運行時刻代碼
                Method wrapperMethod = entryValue.getWrapperMethod();
                wrapperMethod.setAccessible(true);
                Parameter[] parameters = wrapperMethod.getParameters();

                // 構造參數(shù)數(shù)組
                Object[] argsArray = new Object[parameters.length];
                for (int i = 0; i < parameters.length; i++) {
                    Parameter parameter = parameters[i];
                    if (parameter.getType() == ListStateWrapper.class) {
                        // 設置特定參數(shù)的值
                        argsArray[i] = todoListExBean.getStateWrapper();
                    }else if(parameter.getType() == ItemStateWrapper.class){
                        argsArray[i] = entryValue.getStateWrapper();
                    }
                }
                // 執(zhí)行方法
                Object result = wrapperMethod.invoke(entryValue, argsArray);

                //執(zhí)行后置處理,這個執(zhí)行流程和前置是一樣的
                if (entryValue.getTodoItemAfterRunningHandler()!=null){
                    TodoItemAfterRunningHandler todoItemAfterRunningHandler = entryValue.getTodoItemAfterRunningHandler();
                    boolean concierge = todoItemAfterRunningHandler.concierge(
                            entryValue.getStateWrapper(),
                            todoListExBean.getStateWrapper()
                    );
                    if(!concierge){
                        entryValue.setTodoItemStateType(TodoItemStateType.Repairing);
                        if(entryValue.getTodoItemElementType()== TodoItemElementType.CONTINUTEITEM){
                            System.err.println("任務清單:"+todoListExBean.getTodoListName()
                                    +"-Cid:" + todoListExBean.getClsId()+"第"+entryValue.getOrder()+
                                    "方法:"+entryValue.getWrapperMethod().getName()+"未通過運行時執(zhí)行前Handler"
                                    +"正在前往執(zhí)行下一個任務項"
                            );
                        }else {
                            if(todoListExBean.getTodoListElementType()==TodoListElementType.StrongConsistency) {
                                //強一致,這個時候,直接進入失敗隊列
                                entryValue.setTodoItemStateType(TodoItemStateType.Again);
                                TodoListFailedList.addFailedWithSerializable(todoListExBean);
                            }else if(
                                    todoListExBean.getTodoListElementType()==TodoListElementType.WeakConsistency
                            ){
                                entryValue.setTodoItemStateType(TodoItemStateType.Repairing);
                            }
                            return;
                        }
                        //這個時候由于沒有滿足條件,那么這個時候要執(zhí)行對應的恢復函數(shù)
                        todoItemAfterRunningHandler.repair(
                                entryValue.getStateWrapper(),
                                todoListExBean.getStateWrapper()
                        );
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                //對錯誤進行處理
                entryValue.setTodoItemStateType(TodoItemStateType.Error);
                if(entryValue.getTodoItemErrorHandler()!=null){
                    try {
                        TodoItemErrorHandler todoItemErrorHandler = entryValue.getTodoItemErrorHandler();
                        todoItemErrorHandler.concierge(
                                entryValue.getStateWrapper(),
                                todoListExBean.getStateWrapper()
                        );
                    }catch (Exception e1){
                        e1.printStackTrace();
                        //如果這個都執(zhí)行失敗了,那真的沒救了
                        //加入失敗列表看看了,只能,如果是一定要執(zhí)行的話
                        if(todoListExBean.getTodoListElementType()==TodoListElementType.StrongConsistency){
                            TodoListFailedList.addFailedWithSerializable(todoListExBean);
                        }else {
                            System.err.println("任務強制終止");
                        }
                        return;
                    }
                }
            }
            //此時這個任務清單的小項目才算執(zhí)行正常
            entryValue.setTodoItemStateType(TodoItemStateType.Fine);
        }
        //清單項目是執(zhí)行完畢了,那么接下來是這個清單的后置處理部分
        if(todoListExBean.getTodoListAfterHandler()!=null) {
            TodoListAfterHandler todoListAfterHandler = todoListExBean.getTodoListAfterHandler();
            try {
                boolean concierge = todoListAfterHandler.concierge(todoListExBean.getStateWrapper());
                if(!concierge) {

                    todoListExBean.setTodoListStateType(TodoListStateType.Repairing);
                    //這個時候由于沒有滿足條件,那么這個時候要執(zhí)行對應的恢復函數(shù)
                    todoListAfterHandler.repair(
                            todoListExBean.getStateWrapper()
                    );
                }
            } catch (Exception e) {
                e.printStackTrace();
                todoListExBean.setTodoListStateType(TodoListStateType.Error);
                //對錯誤進行處理
                if(todoListExBean.getTodoListErrorHandler()!=null){
                    try {
                        TodoListErrorHandler todoListErrorHandler = todoListExBean.getTodoListErrorHandler();
                        todoListErrorHandler.concierge(
                                todoListExBean.getStateWrapper()
                        );
                    }catch (Exception e1){
                        e1.printStackTrace();
                        if(todoListExBean.getTodoListElementType()==TodoListElementType.StrongConsistency){
                            todoListExBean.setTodoListStateType(TodoListStateType.Error);
                            TodoListFailedList.addFailedWithSerializable(todoListExBean);
                        }else {
                            System.err.println("任務強制終止");
                        }
                    }
                }
            }
        }

        todoListExBean.setTodoListStateType(TodoListStateType.Fine);
    }

那么這里的核心代碼其實就是這一塊兒。當然這個家伙的實現(xiàn)還有一部分,關于這個狀態(tài)恢復的。

總結

那么這篇博文就到這里,今天還有一篇,這里再重復一次(第二次了),我們的項目地址是:https://gitee.com/Huterox/htodo-sechudling文章來源地址http://www.zghlxwxcb.cn/news/detail-641438.html

到了這里,關于造個輪子-任務調度執(zhí)行小框架-任務清單執(zhí)行器實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Mybatis執(zhí)行器(Executor)

    Mybatis執(zhí)行器(Executor)

    Executor Executor是MyBatis的核心接口之一,其中定義了數(shù)據(jù)庫操作的基本方法。在實際應用中經(jīng)常涉及的SqlSession接口的功能,都是基于Executor接口實現(xiàn)的。 BaseExecutor BaseExecutor是一個實現(xiàn)了Executor接口的抽象類,它實現(xiàn)了Executor 接口的大部分方法。BaseExecutor 中主要提供了緩存管理和

    2024年04月16日
    瀏覽(19)
  • Junit執(zhí)行器Runner探索之旅

    單元測試是每個程序員必備的技能,而Runner是每個單元測試類必有屬性。本文通過解讀Junit源碼,介紹junit中每個執(zhí)行器的使用方法,讓讀者在單元測試時,可以靈活的使用Runner執(zhí)行器。 在今年的敏捷團隊建設中,京東物流通過Suite執(zhí)行器實現(xiàn)了一鍵自動化單元測試。Juint除了

    2024年02月08日
    瀏覽(24)
  • PgSQL-執(zhí)行器機制-Unique算子

    PgSQL-執(zhí)行器機制-Unique算子

    PgSQL-執(zhí)行器機制-Unique算子 PgSQL中輸出去重的元組有多種方法,比如通過HashAgg或者GroupAgg。這里我們介紹第三種方法,通過Unique算子來完成這個功能。當然語句上可以是:select distinct(id1) from t; 執(zhí)行器執(zhí)行算子的函數(shù)都是ExecXXX,其中XXX代表某個算子。Unique算子的執(zhí)行是由函數(shù)

    2024年02月07日
    瀏覽(17)
  • 機械臂速成小指南(五):末端執(zhí)行器

    機械臂速成小指南(五):末端執(zhí)行器

    ?????????需要機械臂相關資源的同學可以在評論區(qū)中留言哦?????? 指南目錄??: ????機械臂速成小指南(零點五):機械臂相關資源???? 機械臂速成小指南(零):指南主要內(nèi)容及分析方法 機械臂速成小指南(一):機械臂發(fā)展概況 機械臂速成小指南(二):

    2024年02月03日
    瀏覽(23)
  • 【PostgreSQL內(nèi)核學習(二十三)—— 執(zhí)行器(ExecEndPlan)】

    【PostgreSQL內(nèi)核學習(二十三)—— 執(zhí)行器(ExecEndPlan)】

    聲明 :本文的部分內(nèi)容參考了他人的文章。在編寫過程中,我們尊重他人的知識產(chǎn)權和學術成果,力求遵循合理使用原則,并在適用的情況下注明引用來源。 本文主要參考了 postgresql-10.1 的開源代碼和《OpenGauss數(shù)據(jù)庫源碼解析》和《PostgresSQL數(shù)據(jù)庫內(nèi)核分析》一書 ??在這三

    2024年01月17日
    瀏覽(30)
  • 【PostgreSQL內(nèi)核學習(二十一)—— 執(zhí)行器(InitPlan)】

    【PostgreSQL內(nèi)核學習(二十一)—— 執(zhí)行器(InitPlan)】

    聲明 :本文的部分內(nèi)容參考了他人的文章。在編寫過程中,我們尊重他人的知識產(chǎn)權和學術成果,力求遵循合理使用原則,并在適用的情況下注明引用來源。 本文主要參考了 postgresql-10.1 的開源代碼和《OpenGauss數(shù)據(jù)庫源碼解析》和《PostgresSQL數(shù)據(jù)庫內(nèi)核分析》一書 ??在【

    2024年01月16日
    瀏覽(24)
  • Camunda 7.x 系列【53】Job 執(zhí)行器

    有道無術,術尚可求,有術無道,止于術。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源碼地址:https://gitee.com/pearl-organization/camunda-study-demo Job Executor 即任務執(zhí)行器,是 Camunda 中的一個調度組件,負責執(zhí)行異步后臺作業(yè)。 Job 表示 Job Executor 執(zhí)行的某一作業(yè),例如,在定

    2024年02月09日
    瀏覽(33)
  • xxl-job執(zhí)行器無法自動注冊

    xxl-job執(zhí)行器無法自動注冊

    問題描述 在springboot項目里配置了xxl-job2.3.0,但是執(zhí)行器無法自動注冊 yaml配置如下: 執(zhí)行器無法自動注冊到xxl-job-admin 排查過程 經(jīng)過debug發(fā)現(xiàn),是spring沒有加載xxlJobExecutor這個Bean debug流程(SpringApplication.run()–SpringApplication.refreshContext()–SpringApplication.refresh() --SpringApplication

    2024年02月16日
    瀏覽(22)
  • 【源碼分析】XXL-JOB的執(zhí)行器的注冊流程

    目的:分析xxl-job執(zhí)行器的注冊過程 流程: 獲取執(zhí)行器中所有被注解( @xxlJjob )修飾的 handler 執(zhí)行器注冊過程 執(zhí)行器中任務執(zhí)行過程 版本: xxl-job 2.3.1 建議:下載 xxl-job 源碼,按流程圖 debug 調試, 看堆棧信息并按文章內(nèi)容理解執(zhí)行流程 。 完整流程圖: 部分流程圖: 首先啟

    2023年04月22日
    瀏覽(23)
  • 【微軟】【ICLR 2022】TAPEX:通過學習神經(jīng) SQL 執(zhí)行器進行表預訓練

    【微軟】【ICLR 2022】TAPEX:通過學習神經(jīng) SQL 執(zhí)行器進行表預訓練

    重磅推薦專欄: 《大模型AIGC》;《課程大綱》 本專欄致力于探索和討論當今最前沿的技術趨勢和應用領域,包括但不限于ChatGPT和Stable Diffusion等。我們將深入研究大型模型的開發(fā)和應用,以及與之相關的人工智能生成內(nèi)容(AIGC)技術。通過深入的技術解析和實踐經(jīng)驗分享,

    2024年02月05日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包