天天看點

Prototype功能預覽四:異步處理-完美解決Spring中的事務問題

架構整體介紹:http://blog.csdn.net/flyxxxxx/article/category/7055640

對此架構有興趣或想參與開發的請加QQ群:255195191

在Spring架構中,通常建議事務在Service層完成,但這樣實際會造成這樣一些問題:

1、部分開發會在Controller層調用了多個Service去寫資料庫(這隻有通過代碼的review才能發現)。這在大多數情況下不是問題,但如果是微服務環境,可能會引起大量資料不一緻問題。

如果切換事務到Controller層或Servlet過濾器中,會造成不需要事務的也開啟了事務。

2、調用某些資料庫操作後,需要異步抛出一個事件,在Service這一層可能因事務未送出,事件處理出現問題。

3、需要記錄使用者的記錄檔時,記錄檔嚴格來說,應該在控制器層完成,與業務處理的線程不應該是同一線程(實際開發現狀是幾乎所有系統都沒這樣做),要在控制器層異步記錄記錄檔,通常隻能寫個醜陋的回調線程了。

在Prototype架構中:

public class DemoBusiness extends Business{

    public boolean validate(){

        //在這個方法進行資料校驗

    }

    public void business(TestService ts,Connection connection){

       //在這個方法完成主要業務部

    }

    void async(ApplicationEventPublisher publisher){

        //在這個方法異步抛出事件,此方法會被架構異步調用

    }

    void async(LogService ls){

        //在這個方法記錄操作員日志,此方法會被架構異步調用

    }

}

以上方法中,async開頭的方法(此規則也可以自己定義),參數可以自定義(隻要它來源于Spring applicationContext),被預設為是異步調用的.可以有多個async命名的方法。如果需要,還可以在任意方法上加spring注解@Async來标明此方法需要異步執行

在Prototype架構中,被标明為異步執行的方法,自動使用線程池(如果在Spring applicationContext中有定義一個線程池)來執行異步操作,不需要程式員來指定(當然也可以通過參數指定)。

在Prototype架構中,不同的業務方法(此規則可通過一個注解自定義)根據預先的定義,可以有不同的事務,隻讀,可寫,無事務,異步事務等。以應對不同的場景。

在Spring中,Async注解雖然有異步功能,但使用上并沒有Prototype架構靈活。

繼續閱讀