真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Spring中@Scheduled和HttpClient的示例分析-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“Spring中@Scheduled和HttpClient的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Spring中@Scheduled和HttpClient的示例分析”這篇文章吧。

在南川等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供網(wǎng)站設計制作、網(wǎng)站設計 網(wǎng)站設計制作按需求定制開發(fā),公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站建設,網(wǎng)絡營銷推廣,成都外貿(mào)網(wǎng)站建設公司,南川網(wǎng)站建設費用合理。

曾經(jīng)踩過一個大坑:

由于業(yè)務特殊性,會定時跑很多定時任務,對業(yè)務數(shù)據(jù)進行補償操作等。

在Spring使用過程中,我們可以使用@Scheduled注解可以方便的實現(xiàn)定時任務。

有一天早上突然發(fā)現(xiàn),從前一天晚上某一時刻開始,所有的定時任務全部都卡死不再運行了。

@Scheduled默認單線程

經(jīng)排查后發(fā)現(xiàn),我們使用@Scheduled注解默認的配置的話,所有的任務都是單線程去跑的。寫了一個測試的task讓它sleep住,就很容易發(fā)現(xiàn),其他所有的task在時間到的時候都沒有觸發(fā)。

如果需要開啟多線程處理,則需要進行如下的配置,設置一下線程數(shù):

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
 @Override
 public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
  taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
 }
}

這樣就解決了如果一個task卡住,會引起所有task全部卡住的問題。

但是為什么會有task卡住呢?

HttpClient默認參數(shù)配置

原來,有些task會定時請求外部服務的restful接口,而HttpClient的配置如下:

PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
  connManager.setMaxTotal(maxConnection);
  httpClient = HttpClients.custom()
    .setConnectionManager(connManager)
    .build();

在最開始使用HttpClient的時候,根本沒有想這么多,基本也都是用用默認配置。

追蹤源碼可以發(fā)現(xiàn),在使用上述方式進行配置的時候,HttpClient的timeout時間竟然全部都是-1,也就是說如果對方服務有問題,HttpClient的請求會永不超時,一直等待。源碼如下:

Builder() {
  super();
  this.staleConnectionCheckEnabled = false;
  this.redirectsEnabled = true;
  this.maxRedirects = 50;
  this.relativeRedirectsAllowed = true;
  this.authenticationEnabled = true;
  this.connectionRequestTimeout = -1;
  this.connectTimeout = -1;
  this.socketTimeout = -1;
  this.contentCompressionEnabled = true;
}

所以我們這時候必須手動指定timeout時間,問題就解決了。例如:

PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
  connManager.setMaxTotal(maxConnection);
  RequestConfig defaultRequestConfig = RequestConfig.custom()
    .setSocketTimeout(3000)
    .setConnectTimeout(3000)
    .setConnectionRequestTimeout(3000)
    .build();
  httpClient = HttpClients.custom()
    .setDefaultRequestConfig(defaultRequestConfig)
    .setConnectionManager(connManager)
    .build();

聯(lián)想到另一個問題

其實HttpClient的使用過程中也遇到過另外一個配置的問題,就是defaultMaxPerRoute這個參數(shù)。

最開始使用的時候也沒有注意過這個參數(shù),只是設置過連接池的大連接數(shù)maxTotal。

defaultMaxPerRoute參數(shù)其實代表了每個路由的大連接數(shù)。比如你的系統(tǒng)需要訪問另外兩個服務:google.com 和 bing.com。如果你的maxTotal設置了100,而defaultMaxPerRoute設置了50,那么你的每一個服務的大請求數(shù)大只能是50。

那么如果defaultMaxPerRoute沒有設置呢,追蹤源碼:

public PoolingHttpClientConnectionManager(
  final HttpClientConnectionOperator httpClientConnectionOperator,
  final HttpConnectionFactory connFactory,
  final long timeToLive, final TimeUnit tunit) {
  super();
  this.configData = new ConfigData();
  //這里使用的CPool構造方法,第二個參數(shù)即為defaultMaxPerRoute,也就是默認為2。
  this.pool = new CPool(new InternalConnectionFactory(
    this.configData, connFactory), 2, 20, timeToLive, tunit);
  this.pool.setValidateAfterInactivity(2000);
  this.connectionOperator = Args.notNull(httpClientConnectionOperator, "HttpClientConnectionOperator");
  this.isShutDown = new AtomicBoolean(false);
}

這里發(fā)現(xiàn),原來默認值竟然只有2。怪不得當時在高并發(fā)情況下總會出現(xiàn)超時,明明maxTotal已經(jīng)設的很高。

所以如果你的服務訪問很多不同的外部服務,并且并發(fā)量比較大,一定要好好配置maxTotal和defaultMaxPerRoute兩個參數(shù)。

所以后來再使用任何新的東西,都有好好看下都什么配置,有疑問的一定要先查一下,不要網(wǎng)上copy一段代碼直接就用。當時可能沒問題,但是以后沒準就被坑了。

以上是“Spring中@Scheduled和HttpClient的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


本文標題:Spring中@Scheduled和HttpClient的示例分析-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://weahome.cn/article/dhcidh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部