第76章 JCache
JCache コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.17 以降で利用可能
jcache コンポーネントを使用すると、JCache (JSR-107)をキャッシュ実装として使用してキャッシュ操作を実行できます。キャッシュ自体はオンデマンドで作成されます。その名前のキャッシュがすでに存在する場合は、単に元の設定で使用されます。
このコンポーネントは、プロデューサーおよびイベントベースのコンシューマーエンドポイントをサポートします。
Cache コンシューマーはイベントベースのコンシューマーであり、特定のキャッシュアクティビティーをリッスンして応答するために使用できます。既存のキャッシュから選択を行う必要がある場合は、キャッシュコンポーネントに定義されたプロセッサーを使用します。
Maven ユーザーは、このコンポーネントの以下の依存関係を
pom.xml に追加する必要があります。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jcache</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&...
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
|
名前
|
デフォルト値
|
説明
|
|---|---|---|
cachingProvider
|
null
|
javax.cache.spi.CachingProvider の完全修飾クラス名。OSGI 環境で必須です。
|
|
cacheConfiguration
|
null
|
javax.cache.configuration.Configuration インスタンスへの参照
|
|
cacheConfigurationProperties
|
null
|
javax.cache.CacheManager を作成するための
javax.cache.spi.CachingProvider の java.util.Properties への参照。
|
|
configurationUri
|
null
|
の実装固有の URI
javax.cache.CacheManager
|
|
cacheLoaderFactory
|
null
|
javax.cache.configuration.Factory への参照 javax.cache.integration.CacheLoader
|
|
cacheWriterFactory
|
null
|
javax.cache.configuration.Factory への参照 javax.cache.integration.CacheWriter
|
|
expiryPolicyFactory
|
null
|
javax.cache.configuration.Factory への参照 javax.cache.expiry.ExpiryPolicy
|
|
readThrough
|
false
|
read-through モードが必要であるかどうかを示すフラグ
|
|
writeThrough
|
false
|
write-through モードが必要であるかどうかを示すフラグ
|
| storeByValue | true | キャッシュが store-by-value または store-by-reference であるかどうかを示すフラグ |
|
statisticsEnabled
|
fasle
|
統計収集が有効になっているかどうかを示すフラグ |
|
managementEnabled
|
false
|
管理が有効になっているかどうかを示すフラグ |
|
filteredEvents
|
null
|
フィルターするイベントタイプのコンマ区切りリスト。それらが一緒に指定されると eventFilters によって上書きされます。
|
|
eventFilters
|
null
|
javax.cache.event.CacheEntryEventFilter 参照のコンマ区切りリスト。一緒に指定された場合に filteredEvents を上書きします。
|
| oldValueRequired |
false
|
イベントに古い値が必要であるかどうかを示すフラグ。サポートされる値は CREATED、UPDATED、REMOVED、EXPIRED です。 |
| 同期 | false | イベントリスナーがイベントの原因となるスレッドをブロックするかどうかを示すフラグ |
| action | null | 適用するデフォルトのアクション。ヘッダーの値には優先度があります。 |
| createCacheIfNotExists | true | cacheName で識別されるキャッシュが存在しない場合に作成する必要があるかどうかを設定します。 |
ヘッダー変数 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
|
名前
|
タイプ
|
説明
|
|---|---|---|
|
CamelJCacheAction
|
java.lang.String
|
サポートされる値は PUT、PUTALL、PUTIFABSENT、GET、GETALL、GETANDREMOVE、GETANDREPLACE、GETANDPUT、REPLACE、REMOVE、REMOVEALL、INVOKE、CLEAR です。
|
|
CamelJCacheResult
|
java.lang.Object
|
アクションの結果、つまり PUT、REMOVE、REPLACE のブール値
|
|
CamelJCacheEventType
|
java.lang.String
|
イベントのタイプ
javax.cache.event.EventType
|
|
CamelJCacheKey
|
java.lang.Object
|
アクションを適用するキー
|
| CamelJCacheKeys | java.util.Set<java-lang.Object> | GETALL、REMOVEALL、INVOKE に使用されるアクションを適用するキーのセット |
| CamelJCacheOldValue |
java.lang.Object
|
コンシューマー側では、ヘッダー値にはキーに関連付けられた古い値が含まれます。プロデューサー側で、操作などの CAS を使用するには、ヘッダーに予想される古い値が含まれている必要があります。 |
| CamelJCacheEntryProcessor | javax.cache.processor.EntryProcessor |
INVOKE アクションに使用するエントリープロセッサー
|
| CamelJCacheEntryArgs |
java.util.collection<java.lang.Object>
|
に渡す追加の引数 javax.cache.processor.EntryProcessor
|
JCache ベースのべき等リポジトリーの例: リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
JCacheIdempotentRepository idempotentRepo = new JCacheIdempotentRepository();
idempotentRepo.setCacheName("idempotent-cache")
from("direct:in")
.idempotentConsumer(header("messageId"), idempotentRepo)
.to("mock:out");
JCache ベースの集約リポジトリーの例: リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
package org.apache.camel.component.jcache.processor.aggregate;
import org.apache.camel.EndpointInject;
import org.apache.camel.Exchange;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.processor.aggregate.AggregationStrategy;
import org.junit.Test;
public class JCacheAggregationRepositoryRoutesTest extends JCacheAggregationRepositoryTestSupport {
private static final String MOCK_GOTCHA = "mock:gotcha";
private static final String DIRECT_ONE = "direct:one";
private static final String DIRECT_TWO = "direct:two";
@EndpointInject(uri = MOCK_GOTCHA)
private MockEndpoint mock;
@Produce(uri = DIRECT_ONE)
private ProducerTemplate produceOne;
@Produce(uri = DIRECT_TWO)
private ProducerTemplate produceTwo;
@Test
public void checkAggregationFromTwoRoutes() throws Exception {
final JCacheAggregationRepository repoOne = createRepository(false);
final JCacheAggregationRepository repoTwo = createRepository(false);
final int completionSize = 4;
final String correlator = "CORRELATOR";
RouteBuilder rbOne = new RouteBuilder() {
@Override
public void configure() throws Exception {
from(DIRECT_ONE).routeId("AggregatingRouteOne")
.aggregate(header(correlator))
.aggregationRepository(repoOne)
.aggregationStrategy(new MyAggregationStrategy())
.completionSize(completionSize)
.to(MOCK_GOTCHA);
}
};
RouteBuilder rbTwo = new RouteBuilder() {
@Override
public void configure() throws Exception {
from(DIRECT_TWO).routeId("AggregatingRouteTwo")
.aggregate(header(correlator))
.aggregationRepository(repoTwo)
.aggregationStrategy(new MyAggregationStrategy())
.completionSize(completionSize)
.to(MOCK_GOTCHA);
}
};
context().addRoutes(rbOne);
context().addRoutes(rbTwo);
context().start();
mock.expectedMessageCount(1);
mock.expectedBodiesReceived(1 + 2 + 3 + 4);
produceOne.sendBodyAndHeader(1, correlator, correlator);
produceTwo.sendBodyAndHeader(2, correlator, correlator);
produceOne.sendBodyAndHeader(3, correlator, correlator);
produceOne.sendBodyAndHeader(4, correlator, correlator);
mock.assertIsSatisfied();
}
private class MyAggregationStrategy implements AggregationStrategy {
@Override
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
if (oldExchange == null) {
return newExchange;
} else {
Integer n = newExchange.getIn().getBody(Integer.class);
Integer o = oldExchange.getIn().getBody(Integer.class);
Integer v = (o == null ? 0 : o) + (n == null ? 0 : n);
oldExchange.getIn().setBody(v, Integer.class);
return oldExchange;
}
}
}
protected JCacheAggregationRepository createRepository(boolean optimistic) throws Exception {
JCacheAggregationRepository repository = new JCacheAggregationRepository();
repository.setConfiguration(new JCacheConfiguration());
repository.setCacheName("aggregation-repository");
repository.setOptimistic(optimistic);
return repository;
}
}