基於Java的輕量級非同步程式設計框架
DActor
Introduction
DActor框架可同時支援同步和非同步程式碼,簡化線上非同步程式碼的開發,用同步程式碼的思維來開發非同步程式碼,兼顧非同步程式碼的高併發、無阻塞和同步程式碼的易讀性,可維護性。 基於協程思想設計 最大程度的降低阻塞,提高單個執行緒的處理能力,並可有效的降低執行緒數。
Overview
目前開發過程中的幾個常見模型 – 同步程式設計 所有步驟都在一個主執行緒中完成,呼叫一個方法,等待其響應返回。 – 非同步程式設計 所有步驟都可在不同執行緒中完成,呼叫一個方法,不等待響應既返回,典型交易如NodeJs。 目前市面上的非同步框架都比較複雜,一般為了實現非同步程式設計的解決方案是CallBack和Promise/Deferred模式模式。
為了保留非同步的高效能,簡化非同步的開發模式,同時使得程式更容易被程式設計師理解,基於Actor協程模型,設計了此框架。
Features
- 1、整合Netty
- 2、整合HttpClient
- 3、整合HttpServlet
- 4、支援多層父子結構
- 5、支援責任鏈模式
- 6、J2EE支援json,csv,pdf,xml,html格式輸出
-
7、J2EE支援資料流輸出,動態檔案下載、動態圖片輸出、跳轉和可根據配置動態輸出 環境要求
JDK 1.8
Spring FrameWork 4.3.22.RELEASE +
Servlet 3.0+(因為需要使用Servlet的非同步功能)
注意事項
請求的完整邏輯是分散在不同的執行緒中執行的,所以儘量避免使用ThreadLocal ## Release Note 1.0.0版本 -
初始化版本 ## Getting Started example是J2EE程式,下載後,可直接執行,其中集成了若干例子
預設使用.do提交相關交易,但如果是.json將會返回json資料 啟動後,在瀏覽器中輸入http://localhost:8080/example/randomTxt2.json
輸出的是json格式的字串
randomTxt2:只有一級父子關係
randomTxt1:有二級父子關係 chaintest1:只使用責任鏈
chaintest2:同時使用責任鏈和一級父子關係
exceptionTest:子交易丟擲錯誤,框架對錯誤的處理
httptest演示的是通過httpclient非同步方式訪問百度網站
訪問URL:http://localhost:8080/example/ httptest.do
啟動後,可在控制檯看到內部呼叫結果
Maven dependency
<dependency> <groupId>cn.ymotel</groupId> <artifactId>dactor</artifactId> <version>1.0.1</version> </dependency>
Gradle dependency
compile group: 'cn.ymotel', name: 'dactor', version:'1.0.1'
程式碼簡單講解
執行過程為chain->grandfather->parent->Selft。 依次呼叫執行責任鏈中邏輯,grandfather中的邏輯,parent的邏輯和自身邏輯。 chain,grandfather,parent都可為空,不設定 在grandfather和parent中的Steps中至少有一個為placeholderActor交易,以呼叫子邏輯
整個過程中,需要先設定全域性佔位符
交易中如果未填寫beginBeanId或者endBeanId時,系統預設使用全域性中配置的beginBeanId或者endBeanId
<actor id="randomTxt" parent="actorhttpcore" beginBeanId="randomTxtActor">
<steps>
<step fromBeanId="randomTxtActor" toBeanId="placeholderActor" conditon=""/>
<step fromBeanId="placeholderActor" toBeanId="endActor" conditon=""/>
</steps>
</actor>
condtion可為空,空字串,或者是ognl表示式
placeholderActor的作用是在暫存當前環境,並呼叫子交易,待子交易執行完畢後,再恢復當前環境繼續執行
如果在Step中未找到toBeanIdActor,會直接呼叫endBeanId方法,認為自身交易已執行結束。
交易的請求和流轉資訊都儲存在Message中
如果指定handleException=false或者使用預設設定,直接返回父中執行,如果父中也未捕獲,則繼續返回上一級執行,
一般來說至少有要有一個actor中指定handleException=true 啟動框架接收和執行請求 github地址https://github.com/allon2/dactor