SpringMVCを使用してWebアプリケーションを作成しています。私は次のようなインターフェースを持っています:
public interface SubscriptionService
{
public String getSubscriptionIDForUSer(String userID);
}
実際に別のgetSubscriptionIDForUser
サービスにネットワーク呼び出しを行って、ユーザーのサブスクリプションの詳細を取得します。私のビジネスロジックは、ロジック内の複数の場所でこのメソッドを呼び出します。したがって、特定のHTTPリクエストに対して、このメソッドに対して複数の呼び出しが行われる可能性があります。そのため、この結果をキャッシュして、同じリクエストに対して繰り返しネットワーク呼び出しが行われないようにします。Springのドキュメントを調べましたが、同じリクエストに対してこの結果をキャッシュする方法への参照が見つかりませんでした。言うまでもなく、同じに対する新しいリクエストの場合、キャッシュは無効と見なされますuserID
。
私の要件は次のとおりです。
1つのHTTPリクエストに対して、複数の呼び出しが行われる
getSubscriptionIDForUser
場合、実際のメソッドは1回だけ実行する必要があります。他のすべての呼び出しについては、キャッシュされた結果が返される必要があります。別のHTTPリクエストの場合、メソッドパラメータがまったく同じであっても、新しい呼び出しを行い、キャッシュヒットを無視する必要があります。
ビジネスロジックは、異なるスレッドから並列にロジックを実行する場合があります。したがって、同じHTTPリクエストに対して、Thread-1が現在
getSubscriptionIDForUser
メソッド呼び出しを行っている可能性があり、メソッドが戻る前に、Thread-2も同じパラメーターを使用して同じメソッドを呼び出そうとします。その場合、スレッド2は、別の呼び出しを行うのではなく、スレッド1から行われた呼び出しの戻りを待機するように作成する必要があります。Thread-1から呼び出されたメソッドが戻ると、Thread-2は同じ戻り値を取得するはずです。
ポインタはありますか?
更新:私のWebアプリはVIPの背後にある複数のホストにデプロイされます。私の最も重要な要件は、リクエストレベルのキャッシュです。各リクエストは単一のホストによって処理されるため、サービス呼び出しの結果をそのホストにのみキャッシュする必要があります。同じuserIDを持つ新しいリクエストは、キャッシュから値を取得してはなりません。私はドキュメントを調べましたが、それがどのように行われるかについての参照を見つけることができませんでした。私は間違った場所を見ているのでしょうか?