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
|
定義されたキャッシュに保存される可能性のある要素の数。オプションは以下のとおりです。
|
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
|
キャッシュで実行される操作。有効なオプションは です。
|
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 の管理
以下は、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 つの方法があります。
ehcache.xml
を手動で設定できます。または、- 以下の 3 つのオプションを設定できます。
cacheManagerFactory
eventListenerRegistry
cacheLoaderRegistry
最初のオプションを使用した Camel キャッシュレプリケーションの設定は、すべてのキャッシュを個別に設定する必要があるため、もう少し難しい作業になります。したがって、キャッシュの名前がすべて不明な場合は、
ehcache.xml
を使用することは適切ではありません。
2 つ目のオプションは、キャッシュごとにオプションを定義する必要がないため、多くの異なるキャッシュを使用する場合により適しています。これは、レプリケーションオプションが
CacheManager
ごとおよび CacheEndpoint
ごとに設定されるためです。また、開発フェーズでキャッシュ名がわからない場合は唯一の方法です。
注記
Camel Cache レプリケーションメカニズムをよりよく理解するには、EHCache マニュアル を読むと便利です。
例:JMS キャッシュレプリケーション
JMS レプリケーションは最も強力でセキュアなレプリケーション方法です。Camel キャッシュレプリケーションと併用すると、よりシンプルになります。例と して、別のページ を参照し てください。