EAServer 使用ThreadManager建立服務組件

1、爲何要使用ThreadManager建立服務組件?java

熟悉pb開發組件的人,確定發現了,用pb就能夠直接建立併發布服務類型組件,這種服務類型的組件實現了start(), stop(), run()三個藉口方法,一旦這種類型的組件發佈到eas,當eas服務器從新啓動的時候,eas將自動建立這個組件的實例,而後調用start()方法,start()方法執行完畢,將自動調用run()方法,你能夠在run()方法裏寫一個無限循環語句用來執行你想要的功能,但你還須要在每循環一次後,調用jagSleep()函數讓當前線程休息一會時間,目的就是把cpu時間讓給其餘的組件或則線程,千萬記住,不要在run方法中調用Yield方法,這會致使整個eas中止執行,致使災難性的後果。服務器

這種服務組件的一個最大缺點,就是一旦服務開始執行,你就沒有辦法停掉,由於pb的虛擬機是沒有真正多線程的。這樣一來,你就會在從新服務組件和同步服務器的時候,遇到麻煩,由於組件沒法中止運行,會出現沒法更新組件的問題。多線程

固然,若是你肯定你的組件一旦發佈後,未來不須要更新,你徹底可使用這種類型的組件。儘管如此,我仍是強烈建議你不要使用這種服務組件,而是改用ThreadManager來建立服務類型的組件。併發

2、若是來作?函數

使用ThreadManager建立服務組件,你必需要建立一個普通組件,這個組件必須實現ctsComponents/ThreadBase接口,這個接口只有一個方法,就是void run()方法,和pb的上面說的服務組件不一樣的是,你不用在這個run方法裏寫無限循環代碼用來不停執行你想要的業務處理,你要寫業務處理過程,ThreadManager會自動按照你設置的時間間隔循環調用run方法。線程

好了,下面就跟我來作,開始建立實現ctsComponents/ThreadBase接口的組件。在pb中點新建eas組件,組件類型要選標準組件,在嚮導的Specify Interface Implementation中選擇Implement an Existing EAServer Remote Interface,而後在Select Remote Interface中找到ctsComponents包下的ThreadBase,後面的根據你的狀況,能夠作適當調整,嚮導完成後,將會建立pb組件對象,雙擊開打編輯這個對象,你會發現,這個對象裏只有一個函數,就是run。你只要在這裏寫上你想要的業務邏輯代碼就能夠了,再次提醒你,不要再這個run裏寫無限循環代碼,保證代碼執行一次就能夠正常退出run函數。完成後,發佈組件就能夠了。對象

還有一個方法,就是本身隨便新建一個組件,而後在組件裏添加void run()方法,也是能夠的,這樣是否是更簡單一些?接口

好了,有了組件了,那如何能讓ThreadManager按期去調用個人這個組件,以實現服務組件的功能呢?ci

對了,就是使用ThreadManager這個組件的方法,這個組件一樣在ctsComponents這個包裏。查看ctsComponents/ThreadManager的接口定義,能夠看到,這個組件實現了以下幾個方法,基本上能夠說成對出現的:開發

start和stop,這兩個函數用來開始和中止一個線程,也就是咱們上面說的服務組件

suspend和resume,這兩個函數用來掛起和繼續執行線程

getRunInterval和setRunInterval,這兩個函數用來得到和設置兩次調用run方法之間的間隔,單位是秒

getThreadCount和setThreadCount,這兩個函數用來設置線程的個數,也就是同時有多少個線程

其中,setRunInterval方法須要提供一個時間間隔,單位是秒,這個參數的解釋以下:

大於0,表示每隔這麼多秒執行一次run方法

等於0,表示不停地調用run方法,沒有時間間隔

等於-1,表示run方法僅調用一次

上述幾個函數中,還有一個參數的含義是同樣的,就是線程組。

例如:setRunInterval(string group, long seconds)第一個參數就是線程組,ctsComponents/ThreadManager就是經過這個線程組來表示某一個線程的。因此,這個線程組名稱必定要惟一,不能衝突。

好了,到這裏,咱們也該正式開始實現咱們的服務組件了

這裏,咱們假設上面那個想做爲服務組件運行的組件的組件名稱爲n_work,組件包名爲TM_pkg,咱們接下將講解如何實現服務組件的方法。

既然要調用ctsComponents/ThreadManager的方法,咱們就必需要建立ctsComponents/ThreadManager的實例,建立ctsComponents/ThreadManager組件實例和建立普通組件方法同樣,你能夠在客戶端建立組件實例,也能夠在其餘的組件內部經過組件間調用來建立ctsComponents/ThreadManager組件實例,如今咱們假設無論經過什麼方法,你已經建立了ctsComponents/ThreadManager組件實例,這個組件實例的變量叫 tm。

你只須要添加如下代碼:

//建立n_work的組件實例,變量名叫in_work,你一樣能夠經過組件間調用建立這個實例

tm.setThreadCount("my_first", 1)

tm.setRunInterval("my_first", 10)

tm.start("my_first", in_work)

上述代碼的含義以下:

tm.setThreadCount("my_first", 1),這句代碼設置同時啓動的線程個數,由於pb虛擬機沒有真正的多線程,因此,這裏的第二個參數只能是1,切記!!!若是是java或則C++實現的組件,你能夠設置第二個參數大於1

tm.setRunInterval("my_first", 10),這句代碼設置兩次執行run方法的時間間隔爲10秒

tm.start("my_first", in_work),這句代碼就是將組件n_work做爲線程的執行對象進行執行。

你可能會問了,既然使用pb組件,tm.setThreadCount("my_first", 1)的第二個參數只能爲1,那若是我想啓動多個線程怎麼辦呢?答案是很容易,上面不是說到ctsComponents/ThreadManager是經過線程組來肯定某一個線程的嗎?既然對於pb組件,一個線程組只能啓動一個線程,那咱們就能夠啓動多個線程組來實現pb組件的多線程話,方法就是建立多個n_work組件的實例,例如in_work[10],而後

int i

for i=1 to 10

tm.setThreadCount("my_first_"+string(i), 1)

tm.setRunInterval("my_first_"+string(i), 10)

tm.start("my_first_"+string(i), in_work[i])

next

就能夠了!

好了,如今,你就能夠動手實現你本身的真正多線程的服務組件了。

最後,須要注意的是,要實例化ctsComponents/ThreadManager組件,你必須具備admin的權限,默認狀況下,jagadmin用戶具備admin權限,另外,若是ctsComponents/ThreadManager是在另一個組件中經過組件間調用實例化的,則默認也是具備admin權限的。這點要記住,不然實例化ctsComponents/ThreadManager組件就會失敗。

相關文章
相關標籤/搜索