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

Springboot中的異步任務(wù)執(zhí)行及監(jiān)控詳解

 更新時(shí)間:2023年10月19日 09:01:07   作者:shirukai  
這篇文章主要介紹了Springboot中的異步任務(wù)執(zhí)行及監(jiān)控詳解,除了自己實(shí)現(xiàn)線(xiàn)程外,springboot本身就提供了通過(guò)注解的方式,進(jìn)行異步任務(wù)的執(zhí)行,下面主要記錄一下,在Springboot項(xiàng)目中實(shí)現(xiàn)異步任務(wù),以及對(duì)異步任務(wù)進(jìn)行封裝監(jiān)控,需要的朋友可以參考下

前言

除了自己實(shí)現(xiàn)線(xiàn)程外,springboot本身就提供了通過(guò)注解的方式,進(jìn)行異步任務(wù)的執(zhí)行。

下面主要記錄一下,在Springboot項(xiàng)目中實(shí)現(xiàn)異步任務(wù),以及對(duì)異步任務(wù)進(jìn)行封裝監(jiān)控。

1 開(kāi)啟異步支持

想要使用springboot的注解進(jìn)行異步任務(wù),首先要開(kāi)啟springboot的異步任務(wù)支持。通過(guò)集成AsyncConfigurer接口,并實(shí)現(xiàn)getAsyncExcutor()方法,如下所示:

package com.springboot.demo.asyncTask.conf;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

/**
 * Created by shirukai on 2018/7/30
 * 配置spring boot 多線(xiàn)程支持
 */
@Configuration
@EnableAsync   //開(kāi)啟異步任務(wù)支持
public class SpringTaskExecutor implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(5);
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setQueueCapacity(20);
        taskExecutor.initialize();
        return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}

通過(guò)上面方法,就可以實(shí)現(xiàn)Spring boot的異步任務(wù)支持。然后只需要在想要進(jìn)行異步的方法前添加@Async注解就可以了,如下圖所示:

package com.springboot.demo.asyncTask.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

/**
 * Created by shirukai on 2018/7/31
 * 異步任務(wù)執(zhí)行器
 */
@Component
public class AsyncTaskExecutor {
    private static Logger LOG = LoggerFactory.getLogger(AsyncTaskExecutor.class);
    @Async
    public void executor(AsyncTaskConstructor asyncTaskGenerator, String taskInfo) {
        LOG.info("AsyncTaskExecutor is executing async task:{}", taskInfo);
        asyncTaskGenerator.async();
    }
}

2 異步任務(wù)封裝監(jiān)控

2.1 封裝思路

提供一個(gè)異步任務(wù)的管理器,管理器可以實(shí)現(xiàn)異步任務(wù)的提交、保存任務(wù)信息、獲取任務(wù)信息等功能。

提供一個(gè)異步任務(wù)的監(jiān)控器,用于監(jiān)控異步任務(wù)執(zhí)行狀況,并把執(zhí)行信息保存到緩存中,并記錄任務(wù)執(zhí)行時(shí)間。

提供一個(gè)異步任務(wù)的構(gòu)造器,用于構(gòu)造異步方法。

提供一個(gè)異步任務(wù)的執(zhí)行器,用于執(zhí)行管理器提交的使用構(gòu)造器構(gòu)造的異步方法。

2.2 效果展示

2.2.1 啟動(dòng)異步任務(wù)

2.2.2 查看任務(wù)狀態(tài)

2.3 編碼實(shí)現(xiàn)

2.3.1 conf包

主要是配置springboot的線(xiàn)程池,開(kāi)啟spring boot支持異步支持

SpringTaskExcutor.java

package com.emcc.hiacloud.analytics.asynctask.conf;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

/**
 * Created by shirukai on 2018/7/30
 * 配置spring boot 多線(xiàn)程支持
 */
@Configuration
@EnableAsync   //開(kāi)啟異步任務(wù)支持
public class SpringTaskExecutor implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(5);
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setQueueCapacity(20);
        taskExecutor.initialize();
        return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}

2.3.2 entity包

主要存放TaskInfo實(shí)例類(lèi)用于保存任務(wù)信息,TaskStatusEnmu枚舉類(lèi)用來(lái)存放任務(wù)狀態(tài)。

TaskInfo.java

package com.emcc.hiacloud.analytics.asynctask.entity;


import java.util.Date;

/**
 * Created by shirukai on 2018/7/31
 * 任務(wù)信息
 */
public class TaskInfo {
    private String taskId;
    private TaskStatusEnum status;
    private Date startTime;
    private Date endTime;
    private String totalTime;

    public TaskStatusEnum getStatus() {
        return status;
    }

    public void setStatus(TaskStatusEnum status) {
        this.status = status;
    }

    public void setTotalTime(String totalTime) {
        this.totalTime = totalTime;
    }

    public String getTaskId() {
        return taskId;
    }

    public void setTaskId(String taskId) {
        this.taskId = taskId;
    }

    public Date getStartTime() {
        return startTime;
    }

    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }

    public Date getEndTime() {
        return endTime;
    }

    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }

    public String getTotalTime() {
        return totalTime;
    }

    public void setTotalTime() {
        this.totalTime = (this.endTime.getTime() - this.startTime.getTime()) + "ms";
    }
}

TaskStatusEnum.java

package com.emcc.hiacloud.analytics.asynctask.entity;

/**
 * Created by shirukai on 2018/7/31
 * 任務(wù)狀態(tài)枚舉
 */
public enum TaskStatusEnum {

    STARTED(1, "任務(wù)已經(jīng)啟動(dòng)"),
    RUNNING(0, "任務(wù)正在運(yùn)行"),
    SUCCESS(2, "任務(wù)執(zhí)行成功"),
    FAILED(-2, "任務(wù)執(zhí)行失敗");
    private int state;
    private String stateInfo;

    TaskStatusEnum(int state, String stateInfo) {
        this.state = state;
        this.stateInfo = stateInfo;
    }

    public int getState() {
        return state;
    }

    public String getStateInfo() {
        return stateInfo;
    }

}

2.3.3 manager包

存放要不任務(wù)的管理類(lèi)和監(jiān)控類(lèi)

AsyncTaskManager.java

package com.emcc.hiacloud.analytics.asynctask.manager;


import com.emcc.hiacloud.analytics.asynctask.entity.TaskInfo;
import com.emcc.hiacloud.analytics.asynctask.entity.TaskStatusEnum;
import com.emcc.hiacloud.analytics.asynctask.service.AsyncTaskConstructor;
import com.emcc.hiacloud.analytics.asynctask.service.AsyncTaskExecutor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * Created by shirukai on 2018/7/31
 * 異步任務(wù)管理器
 */
@Component
public class AsyncTaskManager {
    private Map<String, TaskInfo> taskContainer = new HashMap<>(16);
    @Autowired
    AsyncTaskExecutor asyncTaskExecutor;


    /**
     * 初始化任務(wù)
     *
     * @return taskInfo
     */
    public TaskInfo initTask() {
        TaskInfo taskInfo = new TaskInfo();
        taskInfo.setTaskId(getTaskId());
        taskInfo.setStatus(TaskStatusEnum.STARTED);
        taskInfo.setStartTime(new Date());
        setTaskInfo(taskInfo);
        return taskInfo;
    }

    /**
     * 初始化任務(wù)
     * @param asyncTaskConstructor 異步任務(wù)構(gòu)造器
     * @return taskInfo
     */
    public TaskInfo submit(AsyncTaskConstructor asyncTaskConstructor) {
        TaskInfo info = initTask();
        String taskId = info.getTaskId();
        asyncTaskExecutor.executor(asyncTaskConstructor,taskId);
        return info;
    }

    /**
     * 保存任務(wù)信息
     *
     * @param taskInfo 任務(wù)信息
     */
    public void setTaskInfo(TaskInfo taskInfo) {
        taskContainer.put(taskInfo.getTaskId(), taskInfo);
    }

    /**
     * 獲取任務(wù)信息
     *
     * @param taskId 任務(wù)ID
     * @return
     */
    public TaskInfo getTaskInfo(String taskId) {
        return taskContainer.get(taskId);
    }

    /**
     * 獲取任務(wù)狀態(tài)
     *
     * @param taskId 任務(wù)ID
     * @return
     */
    public TaskStatusEnum getTaskStatus(String taskId) {
        return getTaskInfo(taskId).getStatus();
    }

    /**
     * 生成任務(wù)ID
     *
     * @return taskId
     */
    public String getTaskId() {
        return UUID.randomUUID().toString();
    }
}

AsyncTaskMonitor.java

異步任務(wù)的監(jiān)控主要是利用了spring的AOP面向切面,在異步方法的執(zhí)行前和執(zhí)行后進(jìn)行監(jiān)控,判斷任務(wù)狀態(tài),并記錄任務(wù)信息。

package com.emcc.hiacloud.analytics.asynctask.manager;


import com.emcc.hiacloud.analytics.asynctask.entity.TaskInfo;
import com.emcc.hiacloud.analytics.asynctask.entity.TaskStatusEnum;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * Created by shirukai on 2018/7/31
 * 異步任務(wù)監(jiān)控
 */
@Component
@Aspect
public class AsyncTaskMonitor {
    @Autowired
    AsyncTaskManager manager;
    private static Logger LOG = LoggerFactory.getLogger(AsyncTaskMonitor.class);

    @Around("execution(* com.emcc.hiacloud.analytics.asynctask.service.AsyncTaskExecutor.*(..))")
    public void taskHandle(ProceedingJoinPoint pjp) {
        //獲取taskId
        String taskId = pjp.getArgs()[1].toString();
        //獲取任務(wù)信息
        TaskInfo taskInfo = manager.getTaskInfo(taskId);
        LOG.info("AsyncTaskMonitor is monitoring async task:{}", taskId);
        taskInfo.setStatus(TaskStatusEnum.RUNNING);
        manager.setTaskInfo(taskInfo);
        TaskStatusEnum status = null;
        try {
            pjp.proceed();
            status = TaskStatusEnum.SUCCESS;
        } catch (Throwable throwable) {
            status = TaskStatusEnum.FAILED;
            LOG.error("AsyncTaskMonitor:async task {} is failed.Error info:{}", taskId, throwable.getMessage());
        }
        taskInfo.setEndTime(new Date());
        taskInfo.setStatus(status);
        taskInfo.setTotalTime();
        manager.setTaskInfo(taskInfo);
    }
}

2.3.4 service包

主要存放異步任務(wù)的方法構(gòu)造器和執(zhí)行器。

AsyncTaskConstructor

通過(guò)該接口可以構(gòu)建想要實(shí)現(xiàn)的異步方法。只要new 一下接口實(shí)例,然后重寫(xiě)李曼的async()方法即可。

package com.emcc.hiacloud.analytics.asynctask.service;

/**
 * Created by shirukai on 2018/7/31
 * 異步任務(wù)構(gòu)造器
 */
public interface AsyncTaskConstructor {
    public void async();
}

AsyncTaskExecutor.java

異步任務(wù)執(zhí)行器

package com.emcc.hiacloud.analytics.asynctask.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

/**
 * Created by shirukai on 2018/7/31
 * 異步任務(wù)執(zhí)行器
 */
@Component
public class AsyncTaskExecutor {
    private static Logger LOG = LoggerFactory.getLogger(AsyncTaskExecutor.class);
    @Async
    public void executor(AsyncTaskConstructor asyncTaskGenerator, String taskInfo) {
        LOG.info("AsyncTaskExecutor is executing async task:{}", taskInfo);
        asyncTaskGenerator.async();
    }
}

3 應(yīng)用

實(shí)現(xiàn)兩個(gè)接口,一個(gè)是開(kāi)啟一個(gè)異步任務(wù),另一個(gè)是查看任務(wù)狀態(tài)。

想要使用我們剛才分裝好的異步任務(wù),只需要將AsyncTaskManager注入到程序中。

package com.emcc.hiacloud.analytics.orchestrations.controller;

import com.emcc.hiacloud.analytics.asynctask.entity.TaskInfo;
import com.emcc.hiacloud.analytics.asynctask.manager.AsyncTaskManager;
import com.emcc.hiacloud.analytics.common.rest.RestMessage;
import com.emcc.hiacloud.analytics.common.util.RestMessageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by shirukai on 2018/7/31
 */
@RestController
@RequestMapping(value = "/api/v1/asynctask")
public class AsyncTaskController {
    //注入異步任務(wù)管理器
    @Autowired
    AsyncTaskManager asyncTaskManager;

    @RequestMapping(value = "/startTask", method = RequestMethod.GET)
    public RestMessage startAsyncTask() {
        //調(diào)用任務(wù)管理器中的submit去提交一個(gè)異步任務(wù)
        TaskInfo taskInfo = asyncTaskManager.submit(() -> {
            System.out.println("__________");
            try {
                //模擬異步,睡眠6秒
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("__________");
        });
        return RestMessageUtil.objectToRestMessage(taskInfo);
    }

    @RequestMapping(value = "/getTaskStatus", method = RequestMethod.GET)
    public RestMessage getTaskStatus(
            @RequestParam("taskId") String taskId) {
        return RestMessageUtil.objectToRestMessage(asyncTaskManager.getTaskInfo(taskId));
    }
}

到此這篇關(guān)于Springboot中的異步任務(wù)執(zhí)行及監(jiān)控詳解的文章就介紹到這了,更多相關(guān)Springboot異步任務(wù)及監(jiān)控內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java模擬HTTP Get Post請(qǐng)求實(shí)現(xiàn)論壇自動(dòng)回帖功能

    Java模擬HTTP Get Post請(qǐng)求實(shí)現(xiàn)論壇自動(dòng)回帖功能

    這篇文章主要介紹了Java模擬HTTP Get Post請(qǐng)求實(shí)現(xiàn)論壇自動(dòng)回帖功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Java如何判斷整數(shù)溢出,溢出后怎么得到提示

    Java如何判斷整數(shù)溢出,溢出后怎么得到提示

    這篇文章主要介紹了Java如何判斷整數(shù)溢出,溢出后怎么得到提示,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java RandomAccessFile的用法詳解

    Java RandomAccessFile的用法詳解

    下面小編就為大家?guī)?lái)一篇Java RandomAccessFile的用法詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • JSON反序列化中的字段命名沖突問(wèn)題的解決方案解析

    JSON反序列化中的字段命名沖突問(wèn)題的解決方案解析

    在現(xiàn)代Java開(kāi)發(fā)中,JSON已成為前后端交互、微服務(wù)通信和數(shù)據(jù)存儲(chǔ)的標(biāo)準(zhǔn)格式之一,本文將通過(guò)一個(gè)真實(shí)的錯(cuò)誤案例,詳細(xì)分析SerializationException的產(chǎn)生原因,并提供多種解決方案
    2025-08-08
  • Java Web實(shí)現(xiàn)文件下載和亂碼處理方法

    Java Web實(shí)現(xiàn)文件下載和亂碼處理方法

    文件上傳和下載是web開(kāi)發(fā)中常遇到的問(wèn)題。今天小編給大家分享下Java Web實(shí)現(xiàn)文件下載和亂碼處理方法的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • SpringSecurity中@PermitAll與@PreAuthorize的實(shí)現(xiàn)

    SpringSecurity中@PermitAll與@PreAuthorize的實(shí)現(xiàn)

    @PermitAll和@PreAuthorize都是處理安全性的強(qiáng)大工具,本文主要介紹了SpringSecurity中@PermitAll與@PreAuthorize的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • Spring boot JPA實(shí)現(xiàn)分頁(yè)和枚舉轉(zhuǎn)換代碼示例

    Spring boot JPA實(shí)現(xiàn)分頁(yè)和枚舉轉(zhuǎn)換代碼示例

    這篇文章主要介紹了Spring boot JPA實(shí)現(xiàn)分頁(yè)和枚舉轉(zhuǎn)換代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • JAVA利用HttpClient進(jìn)行HTTPS接口調(diào)用的方法

    JAVA利用HttpClient進(jìn)行HTTPS接口調(diào)用的方法

    本篇文章主要介紹了JAVA利用HttpClient進(jìn)行HTTPS接口調(diào)用的方法,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • Java操作MongoDB模糊查詢(xún)和分頁(yè)查詢(xún)

    Java操作MongoDB模糊查詢(xún)和分頁(yè)查詢(xún)

    這篇文章主要介紹了Java操作MongoDB模糊查詢(xún)和分頁(yè)查詢(xún)的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • Java排序算法之桶排序詳解

    Java排序算法之桶排序詳解

    這篇文章主要介紹了Java排序算法之桶排序詳解,桶排序是將數(shù)組中的元素放到一個(gè)一個(gè)的桶中,每個(gè)桶(bucket)代表一個(gè)區(qū)間,里面可以承載一個(gè)或者多個(gè)元素,然后將桶內(nèi)的元素進(jìn)行排序,再按順序遍歷桶,輸出桶內(nèi)元素,需要的朋友可以參考下
    2023-10-10

最新評(píng)論

财经| 高淳县| 广宗县| 观塘区| 碌曲县| 恩施市| 会泽县| 湖北省| 安泽县| 苍山县| 岳池县| 泸水县| 克什克腾旗| 九龙坡区| 辰溪县| 平谷区| 固安县| 左权县| 宜兴市| 延川县| 马山县| 阿尔山市| 芜湖县| 龙游县| 琼中| 沛县| 康保县| 志丹县| 光泽县| 南郑县| 垫江县| 左权县| 青阳县| 和林格尔县| 正镶白旗| 高碑店市| 九江市| 阿鲁科尔沁旗| 赞皇县| 厦门市| 浠水县|