1

特定のイベントが発生したときに、製品の価格データをロードするために呼び出すリモート サービスがあります。読み込まれると、製品の価格が別の消費者にブロードキャストされ、別の場所で処理されます。

呼び出し元のコードは応答を気にしません。それは、アプリケーション イベントに応答し、新しいワークフローをトリガーする、ファイア アンド フォーゲットです。

呼び出しコードをできるだけ速く保つために、ここで @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メソッドで宣言すると (より適切な場所のようです)、アグリゲーターは呼び出されません。

なんで?

4

1 に答える 1

1

@Async開始点はコードがメソッドを呼び出すときであるため、ここでどのように機能するかを確認するのに苦労していますProductPricingGateway.broadcastPricing()

@Asyncgw では、スケジューラは何を送信しますか?

同様に@Async、サービスの場合、スケジューラは何を渡すでしょうidentifiersか?

できるだけ早く非同期にする正しい方法はproduct.pricing.outbound.requestsExecutorChannel...

http://static.springsource.org/spring-integration/reference/html/messaging-channels-section.html#executor-channel

http://static.springsource.org/spring-integration/reference/html/messaging-channels-section.html#channel-configuration-executorchannel

...呼び出し元のスレッドがメッセージをタスク エグゼキューターに渡す場所。

于 2013-04-04T16:26:52.733 に答える