1

リモート サービスのサービス コンポーネントを提供する Spring ライブラリを作成しているとします。サービス コンポーネントは応答データを内部的にキャッシュする必要があり、これには Spring キャッシュが非常に適しています。また、キャッシュをデフォルトのもの (タイムアウト、最大サイズなど) よりも少し高度にする必要があると想像してください。そのため、ライブラリはそれを作成するためのキャッシュ マネージャーを提供します。ただし、サードパーティのキャッシュ マネージャーが、ライブラリが含まれるプロジェクトで使用されるすべてのキャッシュを突然担当することは望ましくありません (プロジェクトには独自のキャッシュがある場合があります)。

私が観察している動作は、プロジェクトが単純な application.properties を使用して構成されたキャッシュを使用している場合 (ehcache としましょう - 以下の例を参照)、構成方法に関係なく、コンポーネントによって提供されるキャッシュマネージャーが呼び出されてすべてのキャッシュを作成することです。コード。これは、プロジェクトが独自のキャッシュ マネージャーを提供していないために発生していますか?

プロジェクトが関与せずに、図書館が提供するサービスでこのようなキャッシングを行うことはできませんか? ライブラリがプロジェクトのキャッシュに干渉することなくキャッシュを提供できることは、ユースケースにとって非常に重要です。


サンプル サービス キャッシュ構成:

@Configuration
public class SpringAceClientCacheConfiguration
{
    @Bean
    public CacheManager serviceCacheManager()
    {
        return new GuavaCacheManager("service-data") {
            @Override
            public Cache getCache(String name) {
                Logger.getLogger(getClass().getName()).info("Creating new cache for " + name + "...");
                return new GuavaCache(name, CacheBuilder.newBuilder().build());
            }
        };
    }
}

サンプル プロジェクト application.properties:

spring.cache.jcache.config=ehcache3.xml

サンプル プロジェクト ehcache3.xml:

<config xmlns='http://www.ehcache.org/v3'
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
        xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
                            http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd">

  <cache alias="content">
    <heap unit="entries">4096</heap>
    <jsr107:mbeans enable-statistics="true"/>
  </cache>
</config>

「サービス データ」キャッシュと「コンテンツ」キャッシュの両方のロギング呼び出しが表示されます。サービス キャッシュ構成は、それ自体のサービス データ キャッシュのみを考慮します。プロジェクトが @Primary を使用して別のキャッシュ マネージャーを宣言しなくても、このキャッシュ専用のキャッシュ マネージャーを提供することはできませんか (うまくいくと思います、まだ試していません)。

助けてくれてありがとう!

4

1 に答える 1

2

「修飾された」という直接的な概念はないため、注釈モデルを使用する場合、完全なキャッシュ インフラストラクチャを管理CacheManagerする 1 つの Bean を提供することが期待されます。CacheManager

ただし、キャッシュの抽象化にはCacheResolverSPI があります。したがって、サードパーティのライブラリには次のものが必要になる場合があります。

@Cacheable(cacheResolver = "requiredCacheResolver")
public Foo someMethod(String id)

その後、requiredCacheResolverBean は、任意のものからキャッシュ情報を取得できCacheManagerます。サードパーティの lib は、1CacheManagerつまたは個々のキャッシュをパラメーターとして受け取る実装を提供できます。

ただし、それをお勧めするかどうかはわかりません。サード パーティのライブラリでキャッシュを使用している場合は、必要なキャッシュをドキュメントで定義する必要があります (有効期限を適切に構成できるように、名前とセマンティックを定義します)。次に、ライブラリの各ユーザーは、インフラストラクチャでこれらのキャッシュを構成する必要があります。最終的には、とにかくそれを行う必要があり、それをユーザーから隠すことはお勧めできません。

于 2017-09-25T12:49:06.800 に答える