特定のイベントが発生したときに、製品の価格データをロードするために呼び出すリモート サービスがあります。読み込まれると、製品の価格が別の消費者にブロードキャストされ、別の場所で処理されます。
呼び出し元のコードは応答を気にしません。それは、アプリケーション イベントに応答し、新しいワークフローをトリガーする、ファイア アンド フォーゲットです。
呼び出しコードをできるだけ速く保つために、ここで @Async を使用したいと思いますが、結果はまちまちです。
基本的な流れは次のとおりです。
CallingCode -> ProductPricingGateway -> Aggregator -> BatchedFetchPricingTask
非同期セットアップは次のとおりです。
<task:annotation-driven executor="executor" scheduler="scheduler"/>
<task:scheduler id="scheduler" pool-size="1" />
<task:executor id="executor" keep-alive="30" pool-size="10-20" queue-capacity="500" rejection-policy="CALLER_RUNS" />
使用される他の 2 つのコンポーネントは@Gateway
、開始コードが呼び出す と、@ServiceActivator
アグリゲーターの背後にあるダウンストリーム です。(通話は小さなグループにまとめられます)。
public interface ProductPricingGateway {
@Gateway(requestChannel="product.pricing.outbound.requests")
public void broadcastPricing(ProductIdentifer productIdentifier);
}
// ...elsewhere...
@Component
public class BatchedFetchPricingTask {
@ServiceActivator(inputChannel="product.pricing.outbound.requests.batch")
public void fetchPricing(List<ProductIdentifer> identifiers)
{
// omitted
}
}
そして、他の関連する統合構成:
<int:gateway service-interface="ProductPricingGateway"
default-request-channel="product.pricing.outbound.requests" />
<int:channel id="product.pricing.outbound.requests" />
<int:channel id="product.pricing.outbound.requests.batch" />
メソッドで宣言すると、正常に動作@Async
することがわかりました。@ServiceActivator
ただし、@Gateway
メソッドで宣言すると (より適切な場所のようです)、アグリゲーターは呼び出されません。
なんで?