對系統未準備好,而拒絕服務的乙個想法

2021-09-01 19:33:37 字數 1993 閱讀 4371

廢話暫且不提,直接開始:

應用場景:

mina + spring 提供對外服務

需求:在整個系統沒有準備好之前,系統對外拒絕服務,因為本系統涉及到一些初始化索引一些比較耗費時間的問題,所以即使spring啟動了,但是資料沒有準備好,依然不能提供服務。

剛開始的時候,使用 spring的 init-method,但是經歷各種蛋疼以後,發現可行性太低,所以我就想,能不能監聽spring的事件來做呢,結果有了如下想法:

這個是整個想法的核心,下面圍繞這個核心,我來做一些解釋。

單獨寫出來的乙個類,因為我的service類有很多,那麼如果我把這些類都放到配置檔案中,以後只要實現各自的方法和更改配置檔案就可以了。

ublic class initdataservice

public void setsearchservices(listsearchservices) }

int serviceamount =  searchservices.size();

final executorservice exec = executors.newfixedthreadpool(serviceamount);

final countdownlatch downlatch = new countdownlatch(serviceamount + 1);

final cyclicbarrier barrier =  new cyclicbarrier(serviceamount, new servicereadythread(downlatch));

因為cyclicbarrier和countdownlatch在定義的時候要指定需要同步的數量。所以有了        int serviceamount =  searchservices.size();

然後建立乙個執行緒池,建立cyclicbarrier和countdownlatch的例項,

這裡需要注意servicereadythread這個引數,這個是我開啟整個服務的乙個標誌位

public class servicereadythread  implements runnable

@override

public void run()

}因為這裡也需要downlatch.countdown(); 所以上述的countdownlatch的引數會 +1.

for (isearchservice isearchservice : searchservices)

這個目的就是把每個service加入到乙個單獨的執行緒中執行,那麼這些執行緒的同步就是cyclicbarrier的工作了。

initluceneindexthread的**public class initluceneindexthread implements runnable

@override

public void run() catch (exception e) finally}}

try catch (interruptedexception e) //等待所有的併發訪問完

上面的**的意思就是等待所有的執行緒執行完,大家看到,這個是downlatch的事情。

執行完以後,沒有以後了。。。。。

但是乙個問題是我前面說的,這個功能是個服務提供的識別符號。那怎麼做的呢,

注意到servicereadythread 中的 luceneutil.setindexready(true);了嗎?

接下來看看這個標誌符的定義

private static volatile boolean isindexready = false; //定義為volatile 你也懂的

get()and set()。。。。。。。

前面提過,我們的服務提供是用mina做的,那麼就在mina的handler裡面做文章,如果isindexready為false

,則不讓客戶端建立連線。

鄭重申明,該想法只是完成了**部分,沒有進行測試,讓大家幫我參謀參謀有什麼需要改進的地方,畢竟乙個人的力量是有限的,我相信群眾。come on, man, 大家來找茬。

你準備好失敗了嗎?

今天讀了乙個有趣的故事。有個男人既非魅力十足,又不幽默風趣,但是特別有女人緣,因此大家百思不得其解。有一天他的乙個朋友忍不住問他是怎麼做到生活中女人不斷的?他坦言 每遇到一位迷人的女性,都會問對方願不願意和自己約會,有些人就會答應他。這個男人願意承受多次拒絕,以換取少數成功。這個故事告訴我們乙個淺顯...

2014我準備好了

2013年已經從身邊溜走了,我又大了一歲,大學生涯剩下的日子也屈指可數了,現在想想大四的這半年加上這個寒假我都做了些什麼呢,每次的總結都是翻閱自己之前寫的部落格,因為必須給自己堅持寫部落格贊乙個.說完計算機就該說下英語了,應該說這半年對於英語的學習,力度是格外的大,從國慶為期一周的賴世雄英語音標的學...

衝吧!不必準備好

這個思考是總結上週的計畫的時候想到的。每當周一的時候,我都抽出時間寫下這週的目標與計畫。並且在每天執行的時候記錄下心得,以及總結。然而,這並沒有什麼卵用,該做的都會完成,想做的少能做到,生活就像一列穩定執行的火車,儘管我迷戀於路邊的風景,它依然會精確的帶著我走向它的方向。那麼什麼是該做的呢?基本上就...