[英]Refactor Legacy SOA system to use non-blocking async microservices
我剛剛開始嘗試了解RxJava,以便可以使用項目反應堆重構Legacy SOA系統來使用非阻塞異步微服務。
目前,我正在進行可行性研究,並考慮使用湯匙之類的東西來轉換遺留服務代碼(但是與此問題無關)
我想知道如何使用反應堆總線請求/回復語法來替換此同步服務代碼。 甚至我應該使用完全不同的反應堆構造。
這是一個傳統soa服務的示例,它是人為設計的,因此可能並不完美,但基本上每個服務都取決於最后一個的結果。
public static Map<String, Object> createAccount(DispatchContext dctx, Map<String, Object> context) {
LocalDispatcher dispatcher = dctx.getDispatcher();
String accountPartyId = (String) context.get("partyId");
Map<String, Object> input = UtilMisc.toMap("groupName", context.get("accountName"), "groupNameLocal", context.get("groupNameLocal"), "officeSiteName", context.get("officeSiteName"), "description", context.get("description"), "partyId", accountPartyId);
Map<String, Object> serviceResults1 = dispatcher.runSync("createPartyGroup", input);
Map<String, Object> serviceResults2 = dispatcher.runSync("createPartyRole", UtilMisc.toMap("partyId", (String) serviceResults1.get("partyId"), "roleTypeId", "ACCOUNT"));
String dataSourceId = (String) context.get("dataSourceId");
Map<String, Object> serviceResults3 = null;
if (dataSourceId != null) {
serviceResults3 = dispatcher.runSync("crmsfa.addAccountDataSource", UtilMisc.toMap("partyId", (String) serviceResults2.get("partyId"), "dataSourceId", dataSourceId));
}
String marketingCampaignId = (String) context.get("marketingCampaignId");
Map<String, Object> serviceResults4 = null;
if (marketingCampaignId != null) {
serviceResults4 = dispatcher.runSync("crmsfa.addAccountMarketingCampaign", UtilMisc.toMap("partyId", (String) serviceResults3.get("partyId"), "marketingCampaignId", marketingCampaignId));
}
String initialTeamPartyId = (String) context.get("initialTeamPartyId");
Map<String, Object> serviceResults5 = null;
if (initialTeamPartyId != null) {
serviceResults5 = dispatcher.runSync("crmsfa.assignTeamToAccount", UtilMisc.toMap("accountPartyId", (String) serviceResults4.get("partyId"), "teamPartyId", initialTeamPartyId, "userLogin", userLogin));
}
Map<String, Object> results = ServiceUtil.returnSuccess();
results.put("groupId", (String) serviceResults1.get("groupId"));
results.put("roleId", (String) serviceResults2.get("roleId"));
results.put("dataSourceId", (String) serviceResults3.get("dataSourceId"));
results.put("marketingCampaignId", (String) serviceResults4.get("marketingCampaignId"));
results.put("teamPartyId", (String) serviceResults5.get("teamPartyId"));
return results;
}
基本上,這是一個使用dispatcher.runSync調用其他服務的服務...我只是在尋找我的研究起點,以研究如何可能使用Reactor或另一個庫將這種類型的語法轉換為異步非阻塞代碼。
在這一點上,我正在用非常模糊的術語來考慮回調/某種Promise類型結構。
就像第一次撥打另一個服務是
Map<String, Object> serviceResults = dispatcher.runSync("createPartyGroup", input);
如果此方法返回一個包含serviceResults映射的Promise對象,則該方法的其余部分可以移入Promise onComplete塊中,結果將是構成該服務方法的一堆深嵌套的onComplete代碼塊。
Promise p = task {
// createPartyGroup service call
}
p.onComplete { result ->
Promise p2 = task {
// createPartyRole sevice call
}
p2.onComplete { result ->
//next service call
}
}
}
或查看類似以下內容的反應堆總線文檔,這些文檔在很多層面上都沒有意義,而我對反應堆的了解還不夠,所以我不知道為什么它沒有意義,或者我接下來要學什么才能理解它的原因沒有道理
bus.send("service.createPartyGroup", Event.wrap(input, "reply.service.createPartyGroup"));
bus.receive($("reply.service.createPartyGroup"), ev -> {
Map<?> input2 = UtilMisc.toMap("partyId", (String) ev.get("partyId"), "roleTypeId", "ACCOUNT")
bus.send("service.createPartyRole", Event.wrap(input2, "reply.service.createPartyRole"));
});
我意識到這是開始研究反應式編程范例的一個相當奇怪的地方。 但是替換此同步服務代碼是我的最終目標,如果我至少了解語法,那么我可以從此倒退。
您只需要使用Observable,就可以在流中將一個發出的項目傳遞到流中。 檢查文檔https://github.com/ReactiveX/RxJava
這將是一個順序的流程
Observable.just(methodThatCallFirstServiceAndReturnObservable(params))
.flatMap(resul1 -> methodThatCallSecondAndReturnObservable(resul1))
.flatMap(resul2 -> methodThatCallThirdAndReturnObservable(resul2))
.subscribe(result3->"Last value emmited here:");
您可以並行運行三個服務調用,並使用Observable.zip或merge將所有值匯總在一起。 但我相信這里不是您所需要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.