這篇文章主要講解了“如何用java設計系統(tǒng)”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何用java設計系統(tǒng)”吧!
成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網(wǎng)站建設、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的福清網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
信息獲取 1. 調(diào)用外部系統(tǒng)接口,通過mq異步返回數(shù)據(jù); 如征信系統(tǒng)、第三方平臺風控系統(tǒng)等 2. 調(diào)用當前應用緩存數(shù)據(jù);如redis or db;
節(jié)點數(shù)據(jù)判別 1.需對某些節(jié)點返回的數(shù)據(jù)進行判別,跳轉節(jié)點 2.每個節(jié)點需對c端做功能處理產(chǎn)生的數(shù)據(jù)和流程中的節(jié)點狀態(tài)扭轉日志進行落地(人行征信拒絕、等待擔保人提交問卷等)
1. 流程可配置化 ——— 應對業(yè)務快速發(fā)展 2. 每個功能點進行模塊化 優(yōu)勢:1.功能單一,開發(fā)人員需求清晰、責任分明; 2.容易對某個功能進行復用、擴展和測試
流程工廠 — 根據(jù)不同資質的用戶有相應的風控流程 <!-- 流程工廠 --> <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>
截止目前為止,已經(jīng)滿足了上面所提到的需求;這種有點偏類似于工作流的模式;
操作步驟 1.當請求到該系統(tǒng)時,系統(tǒng)根據(jù)入?yún)⑦x擇相應的流程; 2.循環(huán)調(diào)用該流程中的每個handler進行處理;
通過handler 接口的演化,可以類似于責任鏈的模式;以往工作經(jīng)歷中有使用過類似的設計方式;當時戲稱為工作流+責任鏈模式;
------------
but .... 系統(tǒng)遠沒有如此簡單;上面可以簡稱為 toy code;
根據(jù)業(yè)務發(fā)展,我們發(fā)現(xiàn)每個handler有自己的特性,分為以下幾點: 1. 普通handler;按照指定的順序,執(zhí)行完功能方法就可以執(zhí)行下一個了; 1. 判別handler;根據(jù)當前handler處理的情況;該flow的執(zhí)行流程會發(fā)生如下改變: - - 終結態(tài),當前線程的鏈路執(zhí)行結束; egg: a -> b -> c -> d ===>> a -> b - - 節(jié)點的跳轉;egg:a -> b -> c -> d ===>> a -> b -> d - - 如普通handler一樣,順序執(zhí)行下一個handler;
而且每個handler可能會對流程中產(chǎn)生的數(shù)據(jù)進行入庫操作和日志記錄等操作; 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是否需要將數(shù)據(jù)更新庫中 * * @return */ default boolean updateDb() { return true; } /** * 獲取handler類名 */ String getBeanName(); }
process method —— 執(zhí)行該handler的功能體
nextHanderIndex —— 返回該handler處理完后的下一個handler下標
updateDb —— 判斷該hander是否有數(shù)據(jù)進行落庫
getBeanName —— 獲取該handler的bean id
這里有一個小的技巧;雖然flow包含一個handler集合;但flow和handler之間仍然是低耦合的;當判斷下一個handler下標的時候,并非交給該handler去決定;而是交回給執(zhí)行該handler的flow去處理;防止handler和某個flow強耦合;
某個handler實現(xiàn)片段代碼:
@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 參數(shù)列表 * */ @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 抽象類執(zhí)行片段:
@Data public abstract class BaseFlow implements Flow { Map<Integer, ProcessHandler> handlerMap; private int length; /** * 當前flow中的handler bean name 對應的執(zhí)行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開始執(zhí)行相應的handler處理器 * * @param index * @param reqParam */ @Override public void execute(int index, ReqParam reqParam) { while (index < length) { ProcessHandler handler = handlerMap.get(index); handler.process(reqParam); // 是否對數(shù)據(jù)進行落庫操作 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(); ... }
執(zhí)行順序:
獲取從第幾個handler開始執(zhí)行,開始時,從第0個handler開始處理;但當調(diào)用外部接口時,通過mq異步返回,則需指定從第幾個handler開始執(zhí)行;
判斷執(zhí)行的handler是否需要存儲數(shù)據(jù)庫或緩存
判斷當前handler是否為終結狀態(tài);該鏈接完全結束
獲取下一個需要執(zhí)行的handler下標;
感謝各位的閱讀,以上就是“如何用java設計系統(tǒng)”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對如何用java設計系統(tǒng)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!
分享名稱:如何用java設計系統(tǒng)
文章出自:http://muchs.cn/article18/pisogp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站制作、外貿(mào)建站、外貿(mào)網(wǎng)站建設、小程序開發(fā)、品牌網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)