主頁 >  其他 > 一文搞懂quartz任務調度框架

一文搞懂quartz任務調度框架

2022-01-28 08:39:52 其他

一、簡單概述

quartz就是一個任務調度框架任務調度就是N個任務,在想要的時間執行!
它有三大核心內容:

  • Job:主要來是用來寫任務的具體內容
  • Trigger:觸發器,主要是用來設定任務的時間
  • Schedule:任務調度器,主要是用來開啟任務,并把Job和Trigger整合,統一管理

下面我先來一個快速上手的方式,讓大哥們先大致了解一下,然后在詳細聊聊三大核心內容,最后再來個監聽器收個尾就可以了!


二、快速上手

1、引入依賴

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>

2、實作JOB類,撰寫需要定時的任務

public class ScheduleTask implements Job {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("執行時間:" + sdf.format(new Date()));
    }
}

3、呼叫定時任務

@Component
public class ScheduleTaskService {
    @PostConstruct
    public void startTask(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("當前時間:" + sdf.format(new Date()));

        Date startTime = new Date();
        startTime.setTime(startTime.getTime() + 5000);
        Date endTime = new Date();
        endTime.setTime(startTime.getTime() + 10000);


        try {
            // 1: 定義JobDetail,并系結任務
            JobDetail jobDetail = JobBuilder.newJob(ScheduleTask.class).build();

            // 2: 定義Trigger觸發器,用來觸發定時任務
            // 方式一:設定開始和結束時間,不設定結束時間默認一直按照呼叫周期執行
            /*Trigger trigger = TriggerBuilder.newTrigger()
                    .startAt(startTime).endAt(endTime)
                    //  repeatSecondlyForever(5) 周期為5s
                    //  SimpleScheduleBuilder.  有很多方法,可以看看
                    .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5))
                    .build();*/

            // 方式二:固定執行周期
            Trigger trigger = TriggerBuilder.newTrigger()
                    .startNow()
                    // withRepeatCount(3) 代表執行 3+1 次
                    .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5).withRepeatCount(3))
                    .build();

            // 3: 定義Schedule,并將JobDetail,Trigger系結
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail, trigger);
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

    }
}

方式一的結果:

在這里插入圖片描述

方式二的結果:

在這里插入圖片描述


三、Job

簡要描述
主要是用來撰寫任務內容用的,寫法就是實作Job類,重寫execute()就可以了!


JobDetail
用來設定Job和一些Job的屬性

// 第一步:系結任務
JobDetail jobDetail = JobBuilder.newJob(ScheduleTask.class)
        .withIdentity("testJob", "testJobGroup").build();

String group = jobDetail.getKey().getGroup();// testJob
String name = jobDetail.getKey().getName();// testJobGroup
String name1 = jobDetail.getJobClass().getName();// 創建JobDetail 類的全路徑

JobJobDetail 的關系?
JobDetail主要用來定義任務資料,而Job是真正的業務邏輯,如果直接使用Job,當是并發場景的話,可能會存在多個Job同時執行,可能會出現問題,如果是JobDetail,則每次執行定時任務的時候,都是創建一個新的Job并不會產生并發問題!


JobDataMap

相當于一個Map集合,用來存盤資料的,可以在創建JobDetail的時候可以傳遞引數,當實作Job的時候可以獲取引數!

來把,寶貝,瞅瞅代碼:

JobDetail jobDetail = JobBuilder.newJob(ScheduleTask.class)
        .usingJobData("testJobDataMap", "testJobDataMapValue")build();
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    JobDetail jobDetail = jobExecutionContext.getJobDetail();
    JobDataMap jobDataMap = jobDetail.getJobDataMap();
    String[] keys = jobDataMap.getKeys();
    System.out.println(jobDataMap.get(keys[0]));

    System.out.println("執行時間:" + sdf.format(new Date()) + ",執行內容:你真棒!你太棒了,你真是太棒了!");
}

注意:JobDataMap不是只能在創建JobDetail的時候可以用,創建Trigger的時候也可以用!
再來瞅瞅代碼,兄弟!

 SimpleTrigger trigger = TriggerBuilder.newTrigger()
       .usingJobData("triggerJobDataKey","triggerJobDataValue")
       .startNow().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(10)).build();
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    Trigger trigger = jobExecutionContext.getTrigger();
    JobDataMap triggerJobDataMap = trigger.getJobDataMap();
    String[] keys1 = triggerJobDataMap.getKeys();
    System.out.println(triggerJobDataMap.get(keys1[0]));
    System.out.println("執行時間:" + sdf.format(new Date()) + ",執行內容:你真棒!你太棒了,你真是太棒了!");
}

JobExecutionContext

execute()方法的引數,可以通過它來傳遞一些資訊!比如JobDetai,Trigger等等

@Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDetail jobDetail = jobExecutionContext.getJobDetail();
        JobDataMap jobDataMap = jobDetail.getJobDataMap();
        String[] keys = jobDataMap.getKeys();
        System.out.println(jobDataMap.get(keys[0]));


        Trigger trigger = jobExecutionContext.getTrigger();
        JobDataMap triggerJobDataMap = trigger.getJobDataMap();
        String[] keys1 = triggerJobDataMap.getKeys();
        System.out.println(triggerJobDataMap.get(keys1[0]));
        System.out.println("執行時間:" + sdf.format(new Date()) + ",執行內容:你真棒!你太棒了,你真是太棒了!");
    }

Job 的狀態

Job有兩種狀態,分別是有狀態和無狀態;

  • 無狀態Job:每次定時執行的時候,JobDataMap是獨立的,資訊不共享,默認是無狀態的!
  • 有狀態Job:每次定時執行的時候,JobDataMap是獨立的,資訊是共享的,可以做程式計數,在實作Job類的上面添加@PersistJobDataAfterExecution即可,建議搭配@DisallowConcurrentExecution食用,因為如果開啟狀態的話可能會引起并發問題,這個注解會禁止并發執行相同的JobDetail實體!

簡單實作“記錄任務的執行次數”!

@Service
public class ScheduleService02 {
    @PostConstruct
    public void startTask(){
        try {
            JobDetail jobDetail = JobBuilder.newJob(ScheduleTask02.class)
                    .usingJobData("count", 0)
                    .withIdentity("jobName", "jobGroup")
                    .build();

            SimpleTrigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("triggerName", "triggerGroup")
                    .startNow()
                    .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(10))
                    .build();

            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail, trigger);
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }


    }
}
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class ScheduleTask02 implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDetail jobDetail = jobExecutionContext.getJobDetail();
        JobDataMap jobDataMap = jobDetail.getJobDataMap();
        Integer count = (Integer) jobDataMap.get("count");
        System.out.println("count::" + ++count);
        jobDataMap.put("count", count);
    }
}

四、Trigger

簡要描述
主要是用來設定任務執行時間,比如任務開始時間,結束時間,執行周期,執行次數,某天的某一時刻等等,都可以時間,極其靈活!

SimpleTrigger

SimpleTrigger trigger = TriggerBuilder.newTrigger()
                    // 設定執行周期,單位秒,并設定執行次數
                    // 專案啟動就執行,每5s一次,一共執行4次(3 + 1)
                    .startNow().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5).withRepeatCount(3))
                    .build();

Date startTime = new Date();
startTime.setTime(startTime.getTime() + 5000);
Date endTime = new Date();
endTime.setTime(startTime.getTime() + 10000);

// 2、通過Trigger設定定時引數
SimpleTrigger trigger = TriggerBuilder.newTrigger()
       // 設定開始時間和結束時間
       .startAt(startTime).endAt(endTime)
       // 每5秒執行一次
       .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5))
       .build();

CronTrigger

Trigger trigger = TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();

"0/5 * * * * ?"cron運算式它是由秒 分 時 日 月 星期組成的,推薦一個在線生成cron運算式的網站!用這個網站就行,很簡單!

五、Schedule

簡要描述
其實就是任務調度管理器,把Job和Trigger整合,并開始任務!

常用方法
整合:scheduler.scheduleJob(jobDetail, trigger);
開始:scheduler.start();
暫停:scheduler.standby();
立馬關閉:scheduler.shutdown(false);
等正在執行的任務結束后關閉:scheduler.shutdown(true);


六、監聽器

簡要描述
監聽器主要是想在任務某一時刻做一些操作!比如任務執行前,或者執行后!有三類監聽器,分別是JobListener,TriggerListener,ScheduleListener三種.


如果用代碼實作那?
1、撰寫任務內容
2、撰寫監聽器(顯現JobListener,TriggerListener,ScheduleListener就行,重寫方法即可!)
3、正常定義三大核心內容后,添加監聽器即可

友情提醒:方法描述在代碼后面,其實只需要簡單看看代碼,只需要怎么寫就行,然后看看方法描述就可以了!

1、撰寫任務內容

/**
 * @author: tianjx
 * @date: 2022/1/26 9:43
 * @description: 撰寫任務內容
 */
public class ScheduleTask06 implements Job {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("執行時間:" + sdf.format(new Date()) + ",執行內容:你真棒,你太棒了,你真的太棒了!");
    }
}

2、撰寫監聽器(顯現JobListener,TriggerListener,ScheduleListener就行,重寫方法即可!)

/**
 * @author: tianjx
 * @date: 2022/1/26 9:53
 * @description: JobListener監聽器
 */
public class MyJobListener implements JobListener {
    @Override
    public String getName() {
        String name = getClass().getName();
        System.out.println("監聽器的名稱:" + name);
        return name;
    }

    @Override
    public void jobToBeExecuted(JobExecutionContext jobExecutionContext) {
        String name = jobExecutionContext.getJobDetail().getKey().getName();
        System.out.println("Job的名稱:" + name + ",【jobToBeExecuted()】方法是Schedule在JobDetail執行前呼叫!");
    }

    @Override
    public void jobExecutionVetoed(JobExecutionContext jobExecutionContext) {
        String name = jobExecutionContext.getJobDetail().getKey().getName();
        System.out.println("Job的名稱:" + name + ",【jobExecutionVetoed()】方法是Schedule在JobDetail即將執行,但是被TriggerListener拒絕之后呼叫");
    }

    @Override
    public void jobWasExecuted(JobExecutionContext jobExecutionContext, JobExecutionException e) {
        String name = jobExecutionContext.getJobDetail().getKey().getName();
        System.out.println("Job的名稱:" + name + ",【jobWasExecuted()】方法是Schedule在JobDetail執行之后呼叫!");
    }
}

------------------------------

/**
 * @author: tianjx
 * @date: 2022/1/26 10:09
 * @description: TriggerListener監聽器
 */
public class MyTriggerListener implements TriggerListener {

    private String name;
    public MyTriggerListener(String name){
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void triggerFired(Trigger trigger, JobExecutionContext jobExecutionContext) {
        String name = trigger.getKey().getName();
        System.out.println(name + "【triggerFired()】被觸發!");
    }

    @Override
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext jobExecutionContext) {
        String name = trigger.getKey().getName();
        System.out.println(name + "【vetoJobExecution()】用來控制任務是否執行!");
        return false;// true:表示不會執行Job方法
    }

    @Override
    public void triggerMisfired(Trigger trigger) {
        String name = trigger.getKey().getName();
        System.out.println(name + "【triggerMisfired()】錯過觸發!");
    }

    @Override
    public void triggerComplete(Trigger trigger, JobExecutionContext jobExecutionContext, Trigger.CompletedExecutionInstruction completedExecutionInstruction) {
        String name = trigger.getKey().getName();
        System.out.println(name + "【triggerComplete()】完成觸發!");
    }
}

---------
/**
 * @author: tianjx
 * @date: 2022/1/26 10:34
 * @description: SchedulerListener監聽器
 */
public class MyScheduleListener implements SchedulerListener {
    @Override
    public void jobScheduled(Trigger trigger) {
        String name = trigger.getJobKey().getName();
        System.out.println(name + "完成部署!");
    }

    @Override
    public void jobUnscheduled(TriggerKey triggerKey) {
        System.out.println(triggerKey + "完成卸載!");
    }

    @Override
    public void triggerFinalized(Trigger trigger) {
        System.out.println("觸發器被移除" + trigger.getJobKey().getName());
    }

    @Override
    public void triggerPaused(TriggerKey triggerKey) {
        System.out.println(triggerKey + "正在被暫停!");
    }

    @Override
    public void triggersPaused(String s) {
        System.out.println(s + "正在被暫停");
    }

    @Override
    public void triggerResumed(TriggerKey triggerKey) {
        System.out.println(triggerKey + "正在從暫停中恢復!");
    }

    @Override
    public void triggersResumed(String s) {
        System.out.println(s + "正在從暫停中恢復!");
    }

    @Override
    public void jobAdded(JobDetail jobDetail) {
        System.out.println(jobDetail.getKey() + "添加作業任務!");
    }

    @Override
    public void jobDeleted(JobKey jobKey) {
        System.out.println(jobKey + "洗掉作業任務!");
    }

    @Override
    public void jobPaused(JobKey jobKey) {
        System.out.println(jobKey + "作業任務正在被暫停!");
    }

    @Override
    public void jobsPaused(String s) {
        System.out.println(s + "作業任務正在被暫停!");
    }

    @Override
    public void jobResumed(JobKey jobKey) {
        System.out.println(jobKey + "正在從暫停中恢復!");
    }

    @Override
    public void jobsResumed(String s) {
        System.out.println(s + "正在從暫停中恢復");
    }

    @Override
    public void schedulerError(String s, SchedulerException e) {
        System.out.println("產生嚴重錯誤時呼叫:   " + s + "  " + e.getUnderlyingException());
    }

    @Override
    public void schedulerInStandbyMode() {
        System.out.println("調度器在掛起模式下呼叫");
    }

    @Override
    public void schedulerStarted() {
        System.out.println("調度器 開啟時呼叫");
    }

    @Override
    public void schedulerStarting() {
        System.out.println("調度器 正在開啟時呼叫");
    }

    @Override
    public void schedulerShutdown() {
        System.out.println("調度器 已經被關閉 時呼叫");
    }

    @Override
    public void schedulerShuttingdown() {
        System.out.println("調度器 正在被關閉 時呼叫");
    }

    @Override
    public void schedulingDataCleared() {
        System.out.println("調度器的資料被清除時呼叫");
    }
}


3、正常定義三大核心內容后,添加監聽器即可

/**
 * @author: tianjx
 * @date: 2022/1/26 9:46
 * @description: 添加監聽器
 */
@Component
public class ScheduleListenerService {
    @PostConstruct
    public void startTask(){

        Date endTime = new Date();
        endTime.setTime(endTime.getTime() + 10000);

        try {
            // 1、獲取JobDetail,并系結Job
            JobDetail jobDetail = JobBuilder.newJob(ScheduleTask06.class).withIdentity("jobName","jobGroup").build();
            // 2、獲取Trigger,并設定定時任務
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("triggerName", "triggerGroup").startNow().endAt(endTime).withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5)).build();
            // 3、通過Schedule,系結JobDetail和Trigger,并開始任務
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            // 添加監聽器
//            scheduler.getListenerManager().addJobListener(new MyJobListener(), EverythingMatcher.allJobs());
//            scheduler.getListenerManager().addTriggerListener(new MyTriggerListener("myTrigger"), EverythingMatcher.allTriggers());
            scheduler.getListenerManager().addSchedulerListener(new MyScheduleListener());

            scheduler.scheduleJob(jobDetail, trigger);

            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

    }
}

JobListener方法描述

  • getName():用于獲取改JobListener 的名稱
  • jobToBeExecuted():Scheduler 在 JobDetail 將要被執行時呼叫這個方法
  • jobExecutionVetoed():Scheduler 在 JobDetail 即將被執行,但又被 TriggerListener 否決時會呼叫該方法
  • jobWasExecuted():Scheduler 在 JobDetail 被執行之后呼叫這個方法



TriggerListener方法描述

  • getName():用于獲取觸發器的名稱
  • triggerFired():當與監聽器相關聯的Trigger被觸發,Job上的execute()方法將被執行時,Scheduler就呼叫該方法
  • vetoJobExecution():在 Trigger 觸發后,Job 將要被執行時由 Scheduler 呼叫這個方法,TriggerListener 給了一個選擇去否決 Job 的執行,假如這個方法回傳 true,這個 Job 將不會為此次 Trigger 觸發而得到執行
  • triggerMisfired():Scheduler 呼叫這個方法是在 Trigger 錯過觸發時,你應該關注此方法中持續時間長的邏輯:在出現許多錯過觸發的 Trigger 時,長邏輯會導致骨牌效應,所以應當保持這方法盡量的小
  • triggerComplete():Trigger 被觸發并且完成了 Job 的執行時,Scheduler 呼叫這個方法,



ScheduleListener方法描述

  • jobScheduled():用于部署JobDetail時呼叫
  • jobUnscheduled():用于卸載JobDetail時呼叫
  • triggerFinalized():當一個 Trigger 來到了再也不會觸發的狀態時呼叫這個方法,除非這個 Job 已設定成了持久性,否則它就會從 Scheduler 中移除,
  • triggersPaused():Scheduler 呼叫這個方法是發生在一個 Trigger 或 Trigger 組被暫停時,假如是 Trigger 組的話,triggerName 引數將為 null,
  • triggersResumed():Scheduler 呼叫這個方法是發生成一個 Trigger 或 Trigger 組從暫停中恢復時,假如是 Trigger 組的話,假如是 Trigger 組的話,triggerName 引數將為 null,引數將為 null,
  • jobsPaused():當一個或一組 JobDetail 暫停時呼叫這個方法,
  • jobsResumed():當一個或一組 Job 從暫停上恢復時呼叫這個方法,假如是一個 Job 組,jobName 引數將為 null,
  • schedulerError():在 Scheduler 的正常運行期間產生一個嚴重錯誤時呼叫這個方法,
  • schedulerStarted():當Scheduler 開啟時,呼叫該方法
  • schedulerInStandbyMode(): 當Scheduler處于StandBy模式時,呼叫該方法
  • schedulerShutdown():當Scheduler停止時,呼叫該方法
  • schedulingDataCleared():當Scheduler中的資料被清除時,呼叫該方法,




第一次寫這么多的內容,花費了不少的時間,差點放棄,哈哈哈哈!如果感覺寫的邏輯不清楚或有問題的地方希望大家能夠指出來!

感謝大家的閱讀,我是Alson_Code🆒,一個喜歡把簡單問題復雜化,把復雜問題簡單化的程式猿! ?

參考文章:菜農日

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/421869.html

標籤:其他

上一篇:Kafka從入門到放棄(四) —— Kafka在大資料領域的應用

下一篇:MacBook安裝Storm與啟動

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more