這篇文章主要講解了“如何用java設計系統”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何用java設計系統”吧!
信息獲取 1. 調用外部系統接口,通過mq異步返回數據; 如征信系統、第三方平臺風控系統等 2. 調用當前應用緩存數據;如redis or db;
節點數據判別 1.需對某些節點返回的數據進行判別,跳轉節點 2.每個節點需對c端做功能處理產生的數據和流程中的節點狀態扭轉日志進行落地(人行征信拒絕、等待擔保人提交問卷等)
1. 流程可配置化 ——— 應對業務快速發展 2. 每個功能點進行模塊化 優勢:1.功能單一,開發人員需求清晰、責任分明; 2.容易對某個功能進行復用、擴展和測試
流程工廠 — 根據不同資質的用戶有相應的風控流程 <!-- 流程工廠 --> <bean id="flowFactory" class="com.souche.risk.admittance.executor.FlowFactory"> <property name="flowMap"> <map> <entry key="xxxFlow" value-ref="xxxFlow"/> ... </map> </property> </bean>
功能模塊定義 <!-- 征信查詢 --> <bean id="aaa" class="com.souche.risk.admittance.executor.handle.AaaHandler"/> <!-- 額度查詢 --> <bean id="bbb" class="com.souche.risk.admittance.executor.handle.BbbHander"/> ...
流程 - handler組裝 <bean id="guaranteeFlow" class="com.souche.risk.admittance.executor.GuaranteeFlow" init-method="init"> <property name="handlerMap"> <map> <entry key="0" value-ref="aaa" /> <entry key="1" value-ref="bbb" /> ... </map> </property> </bean>
截止目前為止,已經滿足了上面所提到的需求;這種有點偏類似于工作流的模式;
操作步驟 1.當請求到該系統時,系統根據入參選擇相應的流程; 2.循環調用該流程中的每個handler進行處理;
通過handler 接口的演化,可以類似于責任鏈的模式;以往工作經歷中有使用過類似的設計方式;當時戲稱為工作流+責任鏈模式;
------------
but .... 系統遠沒有如此簡單;上面可以簡稱為 toy code;
根據業務發展,我們發現每個handler有自己的特性,分為以下幾點: 1. 普通handler;按照指定的順序,執行完功能方法就可以執行下一個了; 1. 判別handler;根據當前handler處理的情況;該flow的執行流程會發生如下改變: - - 終結態,當前線程的鏈路執行結束; egg: a -> b -> c -> d ===>> a -> b - - 節點的跳轉;egg:a -> b -> c -> d ===>> a -> b -> d - - 如普通handler一樣,順序執行下一個handler;
而且每個handler可能會對流程中產生的數據進行入庫操作和日志記錄等操作; handler接口定義:
public interface ProcessHandler<T> {
/**
* handler處理主方法
*
* @param reqParam
* @return
*/
T process(ReqParam reqParam);
/**
* 該handler的下一個handler處理的下標
*
* @param reqParam
* @param flow
* @return
*/
default int nextHanderIndex(ReqParam reqParam, Flow flow) {
return flow.getNextHandlerIndex(getBeanName());
}
/**
* 判斷該handler是否需要將數據更新庫中
*
* @return
*/
default boolean updateDb() {
return true;
}
/**
* 獲取handler類名
*/
String getBeanName();
}process method —— 執行該handler的功能體
nextHanderIndex —— 返回該handler處理完后的下一個handler下標
updateDb —— 判斷該hander是否有數據進行落庫
getBeanName —— 獲取該handler的bean id
這里有一個小的技巧;雖然flow包含一個handler集合;但flow和handler之間仍然是低耦合的;當判斷下一個handler下標的時候,并非交給該handler去決定;而是交回給執行該handler的flow去處理;防止handler和某個flow強耦合;
某個handler實現片段代碼:
@Slf4j
public class AaaQueryHandler implements ProcessHandler<Void> {
private static final String AAA_REJECT = "aaa_reject";
private static final String BEAN_NAME = "aaaQuery";
@Resource
private Service riskService;
/**
* @param reqParam 參數列表
*
*/
@Override
public Void process(ReqParam reqParam) {
RiskAdmittanceQueryParams param = reqParam.getParams();
...
reqParam.putEle(ReqParam.UPDATE_TYPE, UpdateDataType.UPDATE_BUSINESS);
reqParam.putEle(AAA_REJECT, true);
return null;
}
@Override
public int nextHanderIndex(ReqParam reqParam, Flow flow) {
boolean aaaReject = reqParam.getEle(AAA_REJECT);
return flow.judgeAaa(aaaReject, BEAN_NAME);
}
@Override
public String getBeanName() {
return BEAN_NAME;
}
}flow 抽象類執行片段:
@Data
public abstract class BaseFlow implements Flow {
Map<Integer, ProcessHandler> handlerMap;
private int length;
/**
* 當前flow中的handler bean name 對應的執行number
*/
public Map<String, Integer> numberOfHandlerMap;
public void init() {
length = handlerMap.size();
numberOfHandlerMap = handlerMap.entrySet()
.stream()
.collect(Collectors.toMap(entry -> entry.getValue().getBeanName(), Map.Entry::getKey));
}
/**
* 從該flow中指定的index開始執行相應的handler處理器
*
* @param index
* @param reqParam
*/
@Override
public void execute(int index, ReqParam reqParam) {
while (index < length) {
ProcessHandler handler = handlerMap.get(index);
handler.process(reqParam);
// 是否對數據進行落庫操作
boolean flag = handler.updateDb();
if (flag) {
getDataUtil().updateData(reqParam);
}
// 判斷該handler處理完是否終結
boolean endFlag = reqParam.isEnd();
if (endFlag) {
return;
}
index = handler.nextHanderIndex(reqParam, this);
}
}
abstract DataUtil getDataUtil();
...
}執行順序:
獲取從第幾個handler開始執行,開始時,從第0個handler開始處理;但當調用外部接口時,通過mq異步返回,則需指定從第幾個handler開始執行;
判斷執行的handler是否需要存儲數據庫或緩存
判斷當前handler是否為終結狀態;該鏈接完全結束
獲取下一個需要執行的handler下標;
感謝各位的閱讀,以上就是“如何用java設計系統”的內容了,經過本文的學習后,相信大家對如何用java設計系統這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。