一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring Boot實現(xiàn)異步請求(Servlet 3.0)

Spring Boot實現(xiàn)異步請求(Servlet 3.0)

2020-09-19 18:59catoop Java教程

在spring 3.2 及以后版本中增加了對請求的異步處理,這篇文章主要介紹了Spring Boot實現(xiàn)異步請求(Servlet 3.0),感興趣的小伙伴們可以參考一下。

在spring 3.2 及以后版本中增加了對請求的異步處理,旨在提高請求的處理速度降低服務性能消耗。

在我們的請求中做了耗時處理,當并發(fā)請求的情況下,為了避免web server的連接池被長期占用而引起性能問題,調用后生成一個非web的服務線程來處理,增加web服務器的吞吐量。

為此 Servlet 3.0 新增了請求的異步處理,Spring 也在此基礎上做了封裝處理。

本文還是以代碼例子的方式說明如何在 Spring Boot 中應用異步請求。

首先說一下幾個要點:

1、@WebFilter 和 @WebServlet 注解中的 asyncSupported = true 屬性

異步處理的servlet若存在過濾器,則過濾器的注解@WebFilter應設置asyncSupported=true,

否則會報錯 A filter or servlet of the current chain does not support asynchronous operations.

2、@EnableAsync 注解

Spring Boot 默認添加了一些攔截 /* 的過濾器,因為 /* 會攔截所有請求,按理說我們也要設置 asyncSupported=true 屬性。因為這些過濾器都是 Spring Boot 初始化的,所以它提供了 @EnableAsync 注解來統(tǒng)一配置,該注解只針對 “非 @WebFilter 和 @WebServlet 注解的有效”,所以我們自己定義的 Filter 還是需要自己配置 asyncSupported=true 的。

3、AsyncContext 對象

獲取一個異步請求的上下文對象。

4、asyncContext.setTimeout(20 * 1000L);

我們不能讓異步請求無限的等待下去,通過 setTimeout 來設定最大超時時間。

下面通過兩種方式來測試異步任務:

先在 SpringBootSampleApplication 上添加 @EnableAsync 注解。

再檢查所有自定義的Filter,如存在如下兩種情況需要配置 asyncSupported=true

1) 自定義Filter 攔截了 /*

2) 某Filter 攔截了 /shanhy/* ,我們需要執(zhí)行的異步請求的 Servlet 為 /shanhy/testcomet

方法一:原生Servlet方式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package org.springboot.sample.servlet;
 
import java.io.IOException;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
 
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * HTTP長連接實現(xiàn)
 *
 * @author 單紅宇(365384722)
 * @myblog http://blog.csdn.net/catoop/
 * @create 2016年3月29日
 */
@WebServlet(urlPatterns = "/xs/cometservlet", asyncSupported = true)
//異步處理的servlet若存在過濾器,則過濾器的注解@WebFilter應設置asyncSupported=true,
//否則會報錯A filter or servlet of the current chain does not support asynchronous operations.
public class CometServlet extends HttpServlet {
 
 private static final long serialVersionUID = -8685285401859800066L;
 
 private final Queue<AsyncContext> asyncContexts = new LinkedBlockingQueue<>();
 
 private final Thread generator = new Thread("Async Event generator") {
 
  @Override
  public void run() {
   while (!generator.isInterrupted()) {// 線程有效
    try {
     while (!asyncContexts.isEmpty()) {// 不為空
      TimeUnit.SECONDS.sleep(10);// 秒,模擬耗時操作
      AsyncContext asyncContext = asyncContexts.poll();
      HttpServletResponse res = (HttpServletResponse) asyncContext.getResponse();
      res.getWriter().write("{\"result\":\"OK - "+System.currentTimeMillis()+"\"}");
      res.setStatus(HttpServletResponse.SC_OK);
      res.setContentType("application/json");
      asyncContext.complete();// 完成
     }
    } catch (InterruptedException e) {
     Thread.currentThread().interrupt();
     e.printStackTrace();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 
 };
 
 @Override
 public void init() throws ServletException {
  super.init();
  generator.start();
 }
 
 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  System.out.println(">>>>>>>>>>CometServlet Request<<<<<<<<<<<");
  doPost(req, resp);
 }
 
 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  AsyncContext asyncContext = req.startAsync();
  asyncContext.setTimeout(20 * 1000L);
  asyncContexts.offer(asyncContext);
 }
 
 @Override
 public void destroy() {
  super.destroy();
  generator.interrupt();
 }
 
 
}

方法二:Controller 方式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Controller
public class PageController {
 
 @RequestMapping("/async/test")
 @ResponseBody
 public Callable<String> callable() {
  // 這么做的好處避免web server的連接池被長期占用而引起性能問題,
  // 調用后生成一個非web的服務線程來處理,增加web服務器的吞吐量。
  return new Callable<String>() {
   @Override
   public String call() throws Exception {
    Thread.sleep(3 * 1000L);
    return "小單 - " + System.currentTimeMillis();
   }
  };
 }
 
}

最后寫一個comet.jsp頁面測試:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<%@ page pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
 <title>長連接測試</title>
 <script type="text/javascript" src="${pageContext.request.contextPath }/webjarslocator/jquery/jquery.js"></script>
 <script type="text/javascript">
  $(function(){
   function longPolling(){
    $.getJSON('${pageContext.request.contextPath }/xs/cometservlet', function(data){
     console.log(data.result);
     $('#n1').html(data.result);
     longPolling();
    });
   }
   longPolling();
 
   function longPolling2(){
    $.get('${pageContext.request.contextPath }/async/test', function(data){
     console.log(data);
     $('#n2').html(data);
     longPolling2();
    });
   }
   longPolling2();
  });
 </script>
 </head>
 
 <body>
 <h1>長連接測試</h1>
 <h2 id="n1"></h2>
 <h2 id="n2"></h2>
 </body>
</html>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/catoop/article/details/51034866

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美成人免费tv在线播放 | 国产二区精品视频 | 亚洲 欧美 中文 日韩 另类 | 欧美巨胸 | 国内外成人在线视频 | 动漫美女胸被狂揉扒开吃奶动态图 | 久草在线草a免费线看 | 蝴蝶传媒3o45 | 日韩精品一区二区三区免费视频 | 久久偷拍人 | 果冻传媒九一制片厂 | 波多野结衣家庭教师 | 大陆日韩欧美 | 久久国产香蕉 | 国产乱子伦一区二区三区 | 和老外3p爽粗大免费视频 | 西西人体大胆啪啪私拍色约约 | 美女视频在线观看视频 | 国产婷婷成人久久av免费高清 | 香蕉动漫库 | 日本一区二区三区久久精品 | 99国产热 | 厕所rxxx | avtt在线观看| 日韩视频一区 | 精品国产成a人在线观看 | 国产乱码一卡二卡3卡四卡 国产乱插 | 涩涩屋视频在线观看 | 盲井在线 | 大胆国模一区二区三区伊人 | 日本黄视频在线播放 | 四虎论坛| 99久9在线视频 | 亚洲精品国产SUV | 成人天堂入口网站 | 黄 色 成 年人在线 幻女free性俄罗斯第一次摘花 | 2020韩国三级理论在线观看 | 91系列在线观看免费 | 人与善交大片免费看 | 日产精品卡一卡2卡三卡乱码工厂 | 日韩精品视频在线观看免费 |