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

servlet異步請求的實現(xiàn)

 更新時間:2022年07月25日 10:34:36   作者:liushangzaibeijing  
本文主要介紹了servlet異步請求的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1、什么是servlet異步請求

Servlet 3.0 之前,一個普通 Servlet 的主要工作流程大致如下:

(1)、Servlet 接收到請求之后,可能需要對請求攜帶的數(shù)據(jù)進(jìn)行一些預(yù)處理;

(2)、調(diào)用業(yè)務(wù)接口的某些方法,以完成業(yè)務(wù)處理;

(3)、根據(jù)處理的結(jié)果提交響應(yīng),Servlet 線程結(jié)束。

其中第二步處理業(yè)務(wù)邏輯時候很可以碰到比較耗時的任務(wù),此時servlet主線程會阻塞等待完成業(yè)務(wù)處理,對于并發(fā)比較大的請求可能會產(chǎn)生性能瓶頸,則servlet3.0之后再此處做了調(diào)整,引入了異步的概念。

(1)、Servlet 接收到請求之后,可能需要對請求攜帶的數(shù)據(jù)進(jìn)行一些預(yù)處理;

(2)、調(diào)用業(yè)務(wù)接口的某些方法過程中request.startAsync()請求,獲取一個AsyncContext

(3)、緊接著servlet線程退出(回收到線程池),但是響應(yīng)response對象仍舊保持打開狀態(tài),新增線程會使用AsyncContext處理并響應(yīng)結(jié)果。

(4)、AsyncContext處理完成觸發(fā)某些監(jiān)聽通知結(jié)果

2、Servlet異步請求示例

2.1、示例準(zhǔn)備

本示例采用web.xml配置的形式,模擬場景為:筆者所在的it公司每周的工作內(nèi)容,首先研發(fā)總監(jiān)分配給產(chǎn)品、研發(fā)、測試相關(guān)的任務(wù),布置完任務(wù)就出差(模擬請求響應(yīng)),余下的各個小組進(jìn)行自己任務(wù)操作(模擬的耗時操作),最終出周報完成任務(wù)(異步任務(wù)處理完成的通知)

git地址:https://github.com/liushangzaibeijing/spsm.git  分支:dev_async

2.2、實現(xiàn)自定義的Servlet

/**
 * @ClassName AsyncServlet
 * @Desc 自定義異步Servlet處理器
 * @Author xieqx
 * @Date 2020/12/9 15:38
 **/
//通過注解的形式開始異步
@WebServlet(urlPatterns = "*.async",asyncSupported = true)
public class AsyncServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doPost(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //開啟異步支持
        //異步管理上下文
        resp.setCharacterEncoding("GBK");
        PrintWriter writer = resp.getWriter();
        writer.println("周工作任務(wù)布置開始");
        AsyncContext asyncContext = req.startAsync();
        asyncContext.start(new WeekTask(asyncContext));
        //添加監(jiān)聽器 處理完成監(jiān)聽
        asyncContext.addListener(new AsyncListener() {
            @Override
            public void onComplete(AsyncEvent asyncEvent) throws IOException {
                System.out.println("工作在"+new Date()+"處理完成");
            }
            @Override
            public void onTimeout(AsyncEvent asyncEvent) throws IOException {
                System.out.println("工作在"+new Date()+"處理超時");
            }
            @Override
            public void onError(AsyncEvent asyncEvent) throws IOException {
                System.out.println("工作在"+new Date()+"處理出錯");
            }
            @Override
            public void onStartAsync(AsyncEvent asyncEvent) throws IOException {
                System.out.println("工作在"+new Date()+"處理開始");
            }
        });
        writer.println("周工作任務(wù)布置完成");
        writer.flush();
    }
}

  開啟異步支持(默認(rèn)異步支持不開啟)有兩種方式:

使用注解

web.xml配置

	<servlet>
		<servlet-name>asyncServlet</servlet-name>
		<servlet-class>com.xiu.async.servlet.AsyncServlet</servlet-class>
		<!-- 開啟servlet的異步請求操作 -->
		<async-supported>true</async-supported>
	</servlet>
	<servlet-mapping>
		<servlet-name>asyncServlet</servlet-name>
		<url-pattern>*.async</url-pattern>
	</servlet-mapping>

上述代碼中通過request.startAsync()啟動異步處理 返回一個異步上下文對象AsyncContext最終是使用該上下文對象來進(jìn)行異步業(yè)務(wù)邏輯處理,其中有兩個核心方法 

asyncContext.start(new WeekTask(asyncContext));  添加一個異步任務(wù)該任務(wù)是一個Runnable線程接口,這里就清晰了其實是servlet線程將處理任務(wù)交給另一個子線程,servlet直接返回從而達(dá)到提高系統(tǒng)吞吐量的作用。
對于異步請求可以我們需要獲取其中的結(jié)果,所有這里提供了監(jiān)聽器模式添加事件監(jiān)聽AsyncListener

onComplete異步請求處理完成觸發(fā) 前提示需要調(diào)用 asyncContext.complete()方法(因為程序也不知道什么時候任務(wù)算是調(diào)用完畢了)
onTimeout異步請求處理超時觸發(fā),一般來說采用異步請求的任務(wù)都是比較耗時的任務(wù),所以需要修改servlet默認(rèn)的超時時間(修改的長一點)
onError異步處理錯誤的時候觸發(fā)
onStartAsync異步處理開始的時候觸發(fā)即為request.startAsync(),因為添加監(jiān)聽器在startAsync()方法后,所以第一個啟動是無法觸發(fā)該監(jiān)聽的

這里異步處理只是簡單的打印了相關(guān)日志,不過真實的業(yè)務(wù)場景中可以寫復(fù)雜的業(yè)務(wù)處理邏輯。

2.3、異步任務(wù)

這里提供相關(guān)的異步操作是實現(xiàn)runnable的線程實現(xiàn)類,同時這里提供了相關(guān)Job,PmJob(產(chǎn)品任務(wù)),RDJob(研發(fā)任務(wù)),TestJob(測試任務(wù)),每個任務(wù)模擬了10秒的耗時任務(wù)。

/**
 * @ClassName WeekTask
 * @Desc 每周任務(wù) 
 * @Author xieqx
 * @Date 2020/12/10 9:36
 **/
public class WeekTask implements Runnable {
 
    private List<Job> jobs = null;
 
    private AsyncContext asyncContext = null;
    //這里初始化產(chǎn)品任務(wù)PmJob、研發(fā)任務(wù)RDJob  測試任務(wù)TestJob
    public WeekTask(AsyncContext asyncContext) {
       this.asyncContext = asyncContext;
       jobs = new ArrayList<>();
       PmJob pmJob = new PmJob();
       RDJob rdJob = new RDJob();
       TestJob testJob = new TestJob();
       jobs.add(pmJob);
       jobs.add(rdJob);
       jobs.add(testJob);
    }
 
    @Override
    public void run() {
        for(Job job:jobs){
            job.execute();
        }
        System.out.println("周任務(wù)工作完成");
        //job執(zhí)行完成后通知
      asyncContext.complete();
    }
}

  PmJob

/**
 * @ClassName PmTask
 * @Desc 產(chǎn)品經(jīng)理任務(wù)
 * @Author xieqx
 * @Date 2020/12/9 16:03
 **/
public class PmJob implements Job {
    @Override
    public void execute() {
        System.out.println("產(chǎn)品經(jīng)理開評審會議");
        try {
            Thread.sleep(10);
            System.out.println("模擬需求評審會議...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

RDJob

/**
 * @ClassName PmTask
 * @Desc 研發(fā)任務(wù)
 * @Author xieqx
 * @Date 2020/12/9 16:03
 **/
public class RDJob implements Job {
    @Override
    public void execute() {
        System.out.println("程序猿開始開發(fā)");
        try {
            Thread.sleep(10);
            System.out.println("程序猿哼哧哼哧干活中...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

TestJob

/**
 * @ClassName TestJob
 * @Desc 測試任務(wù)
 * @Author xieqx
 * @Date 2020/12/9 16:03
 **/
public class TestJob implements Job {
    @Override
    public void execute()  {
        System.out.println("測試開始測試");
        try {
            Thread.sleep(10);
            System.out.println("測試用例測試...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

2.4、測試場景

請求立馬響應(yīng),但是異步任務(wù)在后面處理

到此這篇關(guān)于servlet異步請求的實現(xiàn)的文章就介紹到這了,更多相關(guān)servlet異步請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring多數(shù)據(jù)源導(dǎo)致配置失效的解決

    Spring多數(shù)據(jù)源導(dǎo)致配置失效的解決

    這篇文章主要介紹了Spring多數(shù)據(jù)源導(dǎo)致配置失效的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Mybatis 自定義類型處理器示例詳解

    Mybatis 自定義類型處理器示例詳解

    在某些情況下我們需要對類型做處理,例如數(shù)據(jù)存儲的是Long,程序里是BigDecimal,那么我們出庫入庫都需要做處理,此時就可以使用類型處理器,本文通過示例給大家介紹Mybatis 自定義類型處理器的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Java實現(xiàn)十進(jìn)制與二進(jìn)制互轉(zhuǎn)的示例詳解

    Java實現(xiàn)十進(jìn)制與二進(jìn)制互轉(zhuǎn)的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java如何實現(xiàn)十進(jìn)制與二進(jìn)制的互轉(zhuǎn),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下
    2022-11-11
  • OpenFeign設(shè)置header的三種方式總結(jié)

    OpenFeign設(shè)置header的三種方式總結(jié)

    在微服務(wù)間使用Feign進(jìn)行遠(yuǎn)程調(diào)用時需要在header中添加信息,下面這篇文章主要給大家介紹了關(guān)于OpenFeign設(shè)置header的三種方式,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • AQS同步組件CyclicBarrier循環(huán)屏障用例剖析

    AQS同步組件CyclicBarrier循環(huán)屏障用例剖析

    這篇文章主要為大家介紹了AQS同步組件CyclicBarrier循環(huán)屏障用例剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 關(guān)于javaWeb中405錯誤的解決方法

    關(guān)于javaWeb中405錯誤的解決方法

    下面小編就為大家?guī)硪黄P(guān)于javaWeb中405錯誤的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java線程中start和run方法全面解析

    Java線程中start和run方法全面解析

    這篇文章主要介紹了Java線程中start和run方法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • JAVA中的注解機制解讀

    JAVA中的注解機制解讀

    這篇文章主要介紹了JAVA中的注解機制解讀,通過調(diào)用Java的反射機制相關(guān)API來訪問annotation信息,首先加載使用注解的類,得到class類,然后再得到類相應(yīng)的方法,成員變量,需要的朋友可以參考下
    2023-10-10
  • Java設(shè)計模式之單例和原型

    Java設(shè)計模式之單例和原型

    這篇文章介紹了Java設(shè)計模式之單例和原型,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • SpringBoot接口防抖(防重復(fù)提交)的實現(xiàn)方案

    SpringBoot接口防抖(防重復(fù)提交)的實現(xiàn)方案

    所謂防抖,一是防用戶手抖,二是防網(wǎng)絡(luò)抖動,在Web系統(tǒng)中,表單提交是一個非常常見的功能,如果不加控制,容易因為用戶的誤操作或網(wǎng)絡(luò)延遲導(dǎo)致同一請求被發(fā)送多次,所以本文給大家介紹了SpringBoot接口防抖(防重復(fù)提交)的實現(xiàn)方案,需要的朋友可以參考下
    2024-04-04

最新評論

徐州市| 乌拉特后旗| 庆云县| 和林格尔县| 保山市| 黔西| 锦屏县| 兴安县| 根河市| 攀枝花市| 师宗县| 宁晋县| 九江市| 基隆市| 田林县| 永胜县| 南开区| 东台市| 孝感市| 买车| 黑河市| 綦江县| 青铜峡市| 磐安县| 三台县| 仙居县| 观塘区| 同德县| 外汇| 邯郸市| 仙居县| 沙洋县| 元氏县| 陈巴尔虎旗| 永宁县| 昭苏县| 津南区| 天台县| 曲松县| 长寿区| 卫辉市|