Red Hat Training

A Red Hat training course is available for Red Hat Fuse

第18章 Cache

18.1. キャッシュコンポーネント

Camel 2.1 以降で利用可能

キャッシュ コンポーネントを使用すると、EHCache をキャッシュ実装として使用してキャッシュ操作を実行できます。キャッシュ自体はオンデマンドで作成されます。その名前のキャッシュがすでに存在する場合は、単に元の設定で使用されます。
このコンポーネントは、プロデューサーおよびイベントベースのコンシューマーエンドポイントをサポートします。
Cache コンシューマーはイベントベースのコンシューマーであり、特定のキャッシュアクティビティーをリッスンして応答するために使用できます。既存のキャッシュから選択を行う必要がある場合は、キャッシュコンポーネントに定義されたプロセッサーを使用します。
Maven ユーザーは、このコンポーネントの pom.xml に以下の依存関係を追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-cache</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

URI 形式

cache://cacheName[?options]
URI にクエリーオプションは ?option=value&option=#beanRef&.. の形式で追加できます。

オプション

Cache コンポーネントは以下のオプションをサポートします。
名前 デフォルト値 説明
maxElementsInMemory 1000 定義されたキャッシュに格納できる要素の数
memoryStoreEvictionPolicy MemoryStoreEvictionPolicy.LFU
定義されたキャッシュに保存される可能性のある要素の数。オプションは以下のとおりです。
  • MemoryStoreEvictionPolicy.LFU - Least frequently used
  • MemoryStoreEvictionPolicy.LRU: 最近使用されたもの
  • MemoryStoreEvictionPolicy.FIFO - まずは作成時間で最も古い要素です。
overflowToDisk true キャッシュがディスクにオーバーフローできるかどうかを指定します。
eternal false
要素が eternal かどうかを設定します。eternal の場合、タイムアウトは無視され、要素が期限切れになりません。
timeToLiveSeconds 300
作成時間と要素の有効期限の最大時間。要素が eternal でない場合にのみ使用されます。
timeToIdleSeconds 300 要素の有効期限が切れる前のアクセス間の最大時間
diskPersistent false ディスクストアが仮想マシンの再起動後も持続するかどうか。
diskExpiryThreadIntervalSeconds 120 ディスク期限切れスレッドの実行間隔(秒単位)。
cacheManagerFactory null Camel 2.8: EHCache net.sf.ehcache.CacheManager をインスタンス化して作成するカスタムファクトリーを使用する場合。タイプ: abstract org.apache.camel.component.cache.CacheManagerFactory
eventListenerRegistry null camel 2.8: 新しいキャッシュすべてに EHCache net.sf.ehcache.event.CacheEventListener の一覧を設定します。EHCache xml 設定のキャッシュごとに定義する必要はありません。Type: org.apache.camel.component.cache.CacheEventListenerRegistry
cacheLoaderRegistry null camel 2. 8: 新しいキャッシュごとに EHCache net.sf.ehcache.loader.CacheLoader Wrapper を拡張する org.apache.camel.component.cache.CacheLoaderWrapper の一覧を設定します。これは、EHCache xml 設定のキャッシュごとに定義する必要はありません。タイプ: org.apache.camel.component.cache.CacheLoaderRegistry
key null Camel 2.10: デフォルトではキャッシュキーを使用して を設定します。キーがメッセージヘッダーに提供されている場合は、ヘッダーのキーが優先されます。
operation null Camel 2.10: デフォルトではキャッシュ操作を使用して設定します。メッセージヘッダーで操作を行うと、ヘッダーからの操作が優先されます。
objectCache false Camel 2.10: シリアライズできないオブジェクトをキャッシュに格納できるようにするかどうか。このオプションを有効にすると、ディスクへのオーバーフローも有効にできません。
configurationFile
Camel 2.13/2.12.3: 使用する ehcache.xml ファイルの場所を設定します(例:クラスパスからロードする classpath:com/foo/mycache.xml など)。設定が指定されていない場合は、EHCache のデフォルト設定が使用されます。
configuration
カスタムの org.apache.camel.component.cache.CacheConfiguration 設定を使用します。

キャッシュコンポーネントのオプション

名前
デフォルト値
説明
configuration
カスタムの org.apache.camel.component.cache.CacheConfiguration 設定を使用します。
cacheManagerFactory
カスタム org.apache.camel.component.cache.CacheManagerFactory を使用するには、を使用します。
configurationFile
Camel 2.13/2.12.3: 使用する ehcache.xml ファイルの場所を設定します(例:クラスパスからロードする classpath:com/foo/mycache.xml など)。設定が指定されていない場合は、EHCache のデフォルト設定が使用されます。

Message Headers Camel 2.8 以降

ヘッダー 説明
CamelCacheOperation
キャッシュで実行される操作。有効なオプションは です。
  • CamelCacheGet
  • CamelCacheCheck
  • CamelCacheAdd
  • CamelCacheUpdate
  • CamelCacheDelete
  • CamelCacheDeleteAll
CamelCacheKey キャッシュに Message を保存するために使用されるキャッシュキー。CamelCacheOperation の場合、キャッシュキーは任意になります。 CamelCacheDeleteAll
Camel 2.8 でのヘッダーの変更
ヘッダー名とサポートされる値は、接頭辞 CamelCache とユースケースが混在するように変更されました。これにより、他のヘッダーから個別のヘッダーを簡単に特定し、維持することができます。CacheConstants の変数名は変更されませんが、値のみが変更されました。また、キャッシュ操作の実行後に、これらのヘッダーがエクスチェンジから削除されるようになりました。
CamelCacheAdd および CamelCacheUpdate 操作は追加のヘッダーをサポートします。
ヘッダー タイプ 説明
CamelCacheTimeToLive 整数 Camel 2.11: 存続時間(秒単位)
CamelCacheTimeToIdle 整数 Camel 2.11: アイドル時間(秒単位)
CamelCacheEternal ブール値 Camel 2.11: コンテンツの対象となるかどうか。

キャッシュプロデューサー

データをキャッシュに送信するには、エクスチェンジのペイロードを既存のキャッシュまたは作成されたオンデマンドキャッシュに保存する必要があります。この作業の仕組み
  • 上記のメッセージ交換ヘッダーの設定。
  • メッセージ交換ボディーにキャッシュに送信されるメッセージが含まれていることの確認

キャッシュコンシューマー

キャッシュからデータを受信するには、CacheConsumer がイベントリスナーを使用して既存または作成されたオンデマンドキャッシュをリッスンし、キャッシュアクティビティー(つまり CamelCacheGet/CamelCacheUpdate/CamelCacheDelete/CamelCacheDelete/CamelCacheDelete/CamelCacheDeleteAll)が発生した場合に自動通知を受け取る必要があります。このような作業が行われているとき
  • 追加/更新されたばかりのペイロードが含まれる Message Exchange ヘッダーと、メッセージ交換ヘッダーを含むエクスチェンジが配置および送信されます。
  • CamelCacheDeleteAll 操作の場合、Message Exchange Header CamelCacheKey および Message Exchange Body は入力されません。

キャッシュプロセッサー

nice プロセッサーのセットには、キャッシュルックアップを実行し、のペイロードコンテンツを選択的に置き換える機能があります。
  • ボディー
  • token
  • XPath レベル

例 1: キャッシュの設定

from("cache://MyApplicationCache" +
          "?maxElementsInMemory=1000" +
          "&memoryStoreEvictionPolicy=" +
              "MemoryStoreEvictionPolicy.LFU" +
          "&overflowToDisk=true" +
          "&eternal=true" +
          "&timeToLiveSeconds=300" +
          "&timeToIdleSeconds=true" +
          "&diskPersistent=true" +
          "&diskExpiryThreadIntervalSeconds=300")

例 2: キーのキャッシュへの追加

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
     from("direct:start")
     .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD))
     .setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson"))
     .to("cache://TestCache1")
   }
};

例 2: キャッシュ内の既存のキーの更新

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
     from("direct:start")
     .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_UPDATE))
     .setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson"))
     .to("cache://TestCache1")
   }
};

例 3: キャッシュ内の既存のキーの削除

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
     from("direct:start")
     .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_DELETE))
     .setHeader(CacheConstants.CACHE_KEY", constant("Ralph_Waldo_Emerson"))
     .to("cache://TestCache1")
   }
};

例 4: キャッシュ内のすべての既存キーの削除

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
     from("direct:start")
     .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_DELETEALL))
     .to("cache://TestCache1");
    }
};

例 5: キャッシュに登録されている変更のプロセッサーおよびその他のプロデューサーへの通知

RouteBuilder builder = new RouteBuilder() {
    public void configure() {
     from("cache://TestCache1")
     .process(new Processor() {
        public void process(Exchange exchange)
               throws Exception {
           String operation = (String) exchange.getIn().getHeader(CacheConstants.CACHE_OPERATION);
           String key = (String) exchange.getIn().getHeader(CacheConstants.CACHE_KEY);
           Object body = exchange.getIn().getBody();
           // Do something
        }
     })
   }
};

例 6: プロセッサーを使用したペイロードをキャッシュ値で選択的に置き換える

RouteBuilder builder = new RouteBuilder() {
   public void configure() {
     //Message Body Replacer
     from("cache://TestCache1")
     .filter(header(CacheConstants.CACHE_KEY).isEqualTo("greeting"))
     .process(new CacheBasedMessageBodyReplacer("cache://TestCache1","farewell"))
     .to("direct:next");

    //Message Token replacer
    from("cache://TestCache1")
    .filter(header(CacheConstants.CACHE_KEY).isEqualTo("quote"))
    .process(new CacheBasedTokenReplacer("cache://TestCache1","novel","#novel#"))
    .process(new CacheBasedTokenReplacer("cache://TestCache1","author","#author#"))
    .process(new CacheBasedTokenReplacer("cache://TestCache1","number","#number#"))
    .to("direct:next");

    //Message XPath replacer
    from("cache://TestCache1").
    .filter(header(CacheConstants.CACHE_KEY).isEqualTo("XML_FRAGMENT"))
    .process(new CacheBasedXPathReplacer("cache://TestCache1","book1","/books/book1"))
    .process (new CacheBasedXPathReplacer("cache://TestCache1","book2","/books/book2"))
    .to("direct:next");
   }
};

例 7: キャッシュからのエントリーの取得

from("direct:start")
    // Prepare headers
    .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_GET))
    .setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")).
    .to("cache://TestCache1").
    // Check if entry was not found
    .choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNull()).
        // If not found, get the payload and put it to cache
        .to("cxf:bean:someHeavyweightOperation").
        .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD))
        .setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson"))
        .to("cache://TestCache1")
    .end()
    .to("direct:nextPhase");

例 8: キャッシュ内のエントリーの確認

注記:CHECK コマンドは、キャッシュにエントリーの存在をテストしますが、本文にメッセージを配置しません。
from("direct:start")
    // Prepare headers
    .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_CHECK))
    .setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson")).
    .to("cache://TestCache1").
    // Check if entry was not found
    .choice().when(header(CacheConstants.CACHE_ELEMENT_WAS_FOUND).isNull()).
        // If not found, get the payload and put it to cache
        .to("cxf:bean:someHeavyweightOperation").
        .setHeader(CacheConstants.CACHE_OPERATION, constant(CacheConstants.CACHE_OPERATION_ADD))
        .setHeader(CacheConstants.CACHE_KEY, constant("Ralph_Waldo_Emerson"))
        .to("cache://TestCache1")
    .end();

EHCache の管理

ehcache に は、JMX からの独自の統計と管理があります。
以下は、Spring アプリケーションコンテキストで JMX 経由で公開する方法のスニペットです。
<bean id="ehCacheManagementService" class="net.sf.ehcache.management.ManagementService" init-method="init" lazy-init="false">
  <constructor-arg>
    <bean class="net.sf.ehcache.CacheManager" factory-method="getInstance"/>
  </constructor-arg>
  <constructor-arg>
    <bean class="org.springframework.jmx.support.JmxUtils" factory-method="locateMBeanServer"/>
  </constructor-arg>
  <constructor-arg value="true"/>
  <constructor-arg value="true"/>
  <constructor-arg value="true"/>
  <constructor-arg value="true"/>
</bean>
当然ながら、Java で同じことを実行できます。
ManagementService.registerMBeans(CacheManager.getInstance(), mbeanServer, true, true, true, true);
このようにキャッシュヒット、ミス、メモリー内ヒット、ディスクヒット、サイズの統計を取得できます。また、CacheConfiguration パラメーターをオンザフライで変更することもできます。

Cache replication Camel 2.8+

Camel Cache コンポーネントは、RMI、JGroups、JMS、Cache Server などの異なるレプリケーションメカニズムを使用して、サーバーノードにキャッシュを分散できます。
これを機能させるには、以下の 2 つの方法があります。
  1. ehcache.xml を手動で設定できます。または、
  2. 以下の 3 つのオプションを設定できます。
    • cacheManagerFactory
    • eventListenerRegistry
    • cacheLoaderRegistry
最初のオプションを使用した Camel キャッシュレプリケーションの設定は、すべてのキャッシュを個別に設定する必要があるため、もう少し難しい作業になります。したがって、キャッシュの名前がすべて不明な場合は、ehcache.xml を使用することは適切ではありません。
2 つ目のオプションは、キャッシュごとにオプションを定義する必要がないため、多くの異なるキャッシュを使用する場合により適しています。これは、レプリケーションオプションが CacheManager ごとおよび CacheEndpoint ごとに設定されるためです。また、開発フェーズでキャッシュ名がわからない場合は唯一の方法です。
注記
Camel Cache レプリケーションメカニズムをよりよく理解するには、EHCache マニュアル を読むと便利です。

例:JMS キャッシュレプリケーション

JMS レプリケーションは最も強力でセキュアなレプリケーション方法です。Camel キャッシュレプリケーションと併用すると、よりシンプルになります。例と して、別のページ を参照し てください。