第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>
Copy to Clipboard Toggle word wrap

URI 形式

cache://cacheName[?options]
Copy to Clipboard Toggle word wrap
以下の形式で URI にクエリーオプションを追加できます。 ?option=value&option=#beanRef&...

オプション

Expand
名前
デフォルト値
説明
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 で識別されるキャッシュが存在しない場合に作成する必要があるかどうかを設定します。

ヘッダー変数

Expand
名前
タイプ
説明
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");
Copy to Clipboard Toggle word wrap

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;
    }
}
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat