プロジェクトリアクターリファクタリングレガシーSOAシステムを使用してノンブロッキング非同期マイクロサービスを使用できるように、RxJavaに頭を悩ませようとしているところです。
現時点では、実現可能性調査を行っており、スプーンのようなものを使用してレガシー サービス コードを変換することを検討しています (ただし、この質問とは関係ありません)。
この同期サービス コードを置き換えるために、reactor-bus Request/Reply 構文を使用する方法を知りたいです。または、まったく異なる原子炉構造を使用する必要がある場合でも。
これは従来の 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を使用して他のサービスを呼び出すサービスです...リアクターまたは別のライブラリを使用して、このタイプの構文を非同期のノンブロッキングコードに変換する方法についての研究の出発点を探しています.
この時点で、私はコールバック/ある種の 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"));
});
リアクティブ プログラミング パラダイムの研究を開始するのはかなり奇妙な場所だと思います。しかし、この同期サービス コードを置き換えることが私の究極の目標であり、少なくとも構文を理解していれば、そこからさかのぼって作業できます。